𝗠𝗮𝘀𝘁𝗲𝗿𝗶𝗻𝗴 𝗘𝘃𝗲𝗻𝘁-𝗗𝗿𝗶𝘃𝗲𝗻 𝗗𝗲𝗰𝗼𝘂𝗽𝗹𝗶𝗻𝗴 𝗶𝗻 𝗟𝗮𝗿𝗮𝘃𝗲𝗹
ਤੁਹਾਡੇ Laravel controllers ਅਕਸਰ business logic ਲਈ dumping grounds ਬਣ ਜਾਂਦੇ ਹਨ।
ਤੁਸੀਂ ਇੱਕ ਸਧਾਰਨ registration flow ਨਾਲ ਸ਼ੁਰੂ ਕਰਦੇ ਹੋ। ਜਲਦੀ ਹੀ, ਤੁਸੀਂ ਇੱਕੋ ਇੱਕ ਮੈਥਡ ਵਿੱਚ email notifications, Slack alerts, audit logs, ਅਤੇ API calls ਜੋੜ ਦਿੰਦੇ ਹੋ। ਇਸ ਨਾਲ ਇੱਕ fat controller ਬਣ ਜਾਂਦਾ ਹੈ।
Fat controllers ਤੁਹਾਡੇ ਕੋਡ ਨੂੰ ਕਮਜ਼ੋਰ (fragile) ਬਣਾਉਂਦੇ ਹਨ। ਉਹਨਾਂ ਨੂੰ ਟੈਸਟ ਕਰਨਾ ਮੁਸ਼ਕਲ ਹੁੰਦਾ ਹੈ। ਉਹ Single Responsibility Principle ਨੂੰ ਤੋੜਦੇ ਹਨ।
ਇਸ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ RabbitMQ ਵਰਗੇ ਗੁੰਝਲਦਾਰ ਟੂਲਸ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। Laravel ਵਿੱਚ ਇੱਕ built-in event system ਹੈ ਜੋ ਜ਼ਿਆਦਾਤਰ ਲੋੜਾਂ ਲਈ ਕੰਮ ਕਰਦਾ ਹੈ।
Tight coupling ਨਾਲ ਹੋਣ ਵਾਲੀ ਸਮੱਸਿਆ: ਜੇਕਰ ਕੋਈ newsletter API ਹੌਲੀ ਹੈ, ਤਾਂ ਤੁਹਾਡੀ user registration ਵੀ ਹੌਲੀ ਹੋ ਜਾਂਦੀ ਹੈ। ਜੇਕਰ ਕੋਈ mail service ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਪੂਰੀ request ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ।
ਹੱਲ: Event-Driven Architecture।
Events ਇੱਕ middle layer ਵਜੋਂ ਕੰਮ ਕਰਦੇ ਹਨ। ਤੁਹਾਡਾ controller ਇੱਕ ਐਕਸ਼ਨ ਦੀ ਘੋਸ਼ਣਾ ਕਰਦਾ ਹੈ। Listeners ਉਸ ਐਕਸ਼ਨ 'ਤੇ ਸੁਤੰਤਰ ਰੂਪ ਵਿੱਚ ਪ੍ਰਤੀਕਿਰਿਆ ਕਰਦੇ ਹਨ।
ਇੱਕ lean controller ਇਸ ਤਰ੍ਹਾਂ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ:
public function register(RegisterRequest $request)
{
$user = User::create($request->validated());
UserRegistered::dispatch($user);
return response()->json(['message' => 'Success'], 201);
}
ਹੁਣ controller ਸਿਰਫ਼ data persistence ਨੂੰ ਸੰਭਾਲਦਾ ਹੈ। ਇਸਨੂੰ side effects ਦੀ ਚਿੰਤਾ ਨਹੀਂ ਹੁੰਦੀ।
ਤੁਹਾਨੂੰ ਤਿੰਨ ਮੁੱਖ ਫਾਇਦੇ ਮਿਲਦੇ ਹਨ:
- Performance: ਯੂਜ਼ਰਸ ਨੂੰ ਤੁਰੰਤ ਜਵਾਬ ਮਿਲਦਾ ਹੈ। ਭਾਰੀ ਕੰਮ ShouldQueue interface ਦੀ ਵਰਤੋਂ ਕਰਕੇ background ਵਿੱਚ ਚੱਲਦੇ ਹਨ।
- Resilience: ਜੇਕਰ ਕੋਈ service ਡਾਊਨ ਹੈ, ਤਾਂ listener ਮੁੱਖ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਤੋੜੇ ਬਿਨਾਂ ਕੰਮ ਨੂੰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ (retry) ਕਰ ਸਕਦਾ ਹੈ।
- Extensibility: ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ listener ਜੋੜ ਕੇ push notifications ਵਰਗੀਆਂ ਨਵੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਜੋੜ ਸਕਦੇ ਹੋ। ਤੁਹਾਨੂੰ ਅਸਲ controller ਨੂੰ ਛੂਹਣ ਦੀ ਲੋੜ ਨਹੀਂ ਪੈਂਦੀ।
ਅਪਣਾਉਣ ਲਈ ਵਧੀਆ ਅਭਿਆਸ (Best practices):
- Side effects 'ਤੇ ਧਿਆਨ ਦਿਓ: Post-processing ਲਈ events ਦੀ ਵਰਤੋਂ ਕਰੋ। ਉਹਨਾਂ ਦੀ ਵਰਤੋਂ ਉਸ core logic ਲਈ ਨਾ ਕਰੋ ਜੋ ਤੁਰੰਤ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।
- ਵਰਣਨਸ਼ੀਲ ਨਾਮ (descriptive names) ਵਰਤੋ: Past-tense ਨਾਮ ਜਿਵੇਂ ਕਿ OrderPlaced ਜਾਂ UserRegistered ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਦਰਸਾਉਂਦਾ ਹੈ ਕਿ ਐਕਸ਼ਨ ਪਹਿਲਾਂ ਹੀ ਹੋ ਚੁੱਕਾ ਹੈ।
- Over-abstraction ਤੋਂ ਬਚੋ: ਜੇਕਰ ਕੋਡ ਦਾ ਕੋਈ ਹਿੱਸਾ ਸਧਾਰਨ ਹੈ ਅਤੇ ਇੱਕ ਹੀ ਜਗ੍ਹਾ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਤਾਂ event ਨਾਲੋਂ function call ਬਿਹਤਰ ਹੈ।
Database ਤਬਦੀਲੀਆਂ ਲਈ Eloquent Observers ਦੀ ਵਰਤੋਂ ਕਰੋ। Business actions ਲਈ Events ਦੀ ਵਰਤੋਂ ਕਰੋ।
Events ਵਿੱਚ refactoring ਕਰਨਾ durability ਬਾਰੇ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਕੋਡ ਨੂੰ debug ਕਰਨਾ ਆਸਾਨ ਅਤੇ test ਕਰਨਾ ਤੇਜ਼ ਬਣਾਉਂਦਾ ਹੈ।
ਅੱਜ ਹੀ ਆਪਣੇ controller ਵਿੱਚੋਂ ਇੱਕ noisy side effect ਚੁਣੋ ਅਤੇ ਇਸਨੂੰ ਇੱਕ listener ਵਿੱਚ ਬਦਲ ਦਿਓ।
ਇਸ sandbox ਉਦਾਹਰਣ ਨੂੰ ਅਜ਼ਮਾਓ: https://onlinephp.io/c/1f7b2