𝗠𝗮𝘀𝘁𝗲đ—ŋđ—ļđ—ģ𝗴 𝗘𝘃𝗲đ—ģ𝘁-𝗗đ—ŋđ—ļ𝘃𝗲đ—ģ 𝗗𝗲𝗰đ—ŧ𝘂đ—Ŋ𝗹đ—ļđ—ģ𝗴 đ—ļđ—ģ 𝗟𝗮đ—ŋ𝗮𝘃𝗲𝗹

āφāĻĒāύāĻžāϰ Laravel āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰāϗ⧁āϞ⧋ āĻĒā§āϰāĻžāϝāĻŧāĻļāχ āĻŦāĻŋāϜāύ⧇āϏ āϞāϜāĻŋāϕ⧇āϰ (business logic) āĻ¸ā§āϤ⧂āĻĒ āĻŦāĻž āĻĄāĻžāĻŽā§āĻĒāĻŋāĻ‚ āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻšāϝāĻŧ⧇ āĻ“āϠ⧇āĨ¤

āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰ⧇āĻļāύ āĻĢā§āϞ⧋ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇āύāĨ¤ āĻļā§€āĻ˜ā§āϰāχ, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻŽāĻžāĻ¤ā§āϰ āĻŽā§‡āĻĨāĻĄā§‡āϰ āĻŽāĻ§ā§āϝ⧇ āχāĻŽā§‡āϞ āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ, Slack āĻ…ā§āϝāĻžāϞāĻžāĻ°ā§āϟ, āĻ…āĻĄāĻŋāϟ āϞāĻ— āĻāĻŦāĻ‚ API āĻ•āϞ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇ āĻĢ⧇āϞ⧇āύāĨ¤ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ 'fat controller' āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

Fat controller āφāĻĒāύāĻžāϰ āϕ⧋āĻĄāϕ⧇ āĻ­āĻ™ā§āϗ⧁āϰ (fragile) āĻ•āϰ⧇ āϤ⧋āϞ⧇āĨ¤ āĻāϗ⧁āϞ⧋ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāĻž āĻ•āĻ āĻŋāύāĨ¤ āĻāϗ⧁āϞ⧋ Single Responsibility Principle āϞāĻ™ā§āϘāύ āĻ•āϰ⧇āĨ¤

āĻāϟāĻŋ āĻ āĻŋāĻ• āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϰ RabbitMQ-āĻāϰ āĻŽāϤ⧋ āϜāϟāĻŋāϞ āϟ⧁āϞ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχāĨ¤ Laravel-āĻāϰ āύāĻŋāϜāĻ¸ā§āĻŦ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ˛ā§āϟ-āχāύ āχāϭ⧇āĻ¨ā§āϟ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

Tight coupling-āĻāϰ āϏāĻŽāĻ¸ā§āϝāĻžāϗ⧁āϞ⧋: āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āύāĻŋāωāϜāϞ⧇āϟāĻžāϰ API āϧ⧀āϰāĻ—āϤāĻŋāϰ āĻšāϝāĻŧ, āϤāĻŦ⧇ āφāĻĒāύāĻžāϰ āχāωāϜāĻžāϰ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰ⧇āĻļāύāĻ“ āϧ⧀āϰ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧāĨ¤ āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āĻŽā§‡āχāϞ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ, āϤāĻŦ⧇ āĻĒ⧁āϰ⧋ āϰāĻŋāϕ⧋āϝāĻŧ⧇āĻ¸ā§āϟāϟāĻŋāχ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧāĨ¤

āϏāĻŽāĻžāϧāĻžāύ: Event-Driven ArchitectureāĨ¤

āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞ⧋ āĻāĻ•āϟāĻŋ āĻŽāĻŋāĻĄāϞ āϞ⧇āϝāĻŧāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻžāϰ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻ•āĻļāύ āĻ˜ā§‹āώāĻŖāĻž āĻ•āϰ⧇āĨ¤ āϞāĻŋāϏ⧇āύāĻžāϰāϗ⧁āϞ⧋ (Listeners) āĻ¸ā§āĻŦāĻžāϧ⧀āύāĻ­āĻžāĻŦ⧇ āϏ⧇āχ āĻ…ā§āϝāĻžāĻ•āĻļāύ⧇ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϜāĻžāύāĻžāϝāĻŧāĨ¤

āĻāĻ•āϟāĻŋ āϞāĻŋāύ (lean) āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻĻ⧇āĻ–āϤ⧇ āĻāĻŽāύ āĻšāϝāĻŧ:

public function register(RegisterRequest $request)
{
    $user = User::create($request->validated());

    UserRegistered::dispatch($user);

    return response()->json(['message' => 'Success'], 201);
}

āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰāϟāĻŋ āĻāĻ–āύ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĄā§‡āϟāĻž āĻĒāĻžāϰāϏāĻŋāĻ¸ā§āĻŸā§‡āĻ¨ā§āϏ (data persistence) āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āϏāĻžāχāĻĄ āχāĻĢ⧇āĻ•ā§āϟ (side effects) āύāĻŋāϝāĻŧ⧇ āĻŽāĻžāĻĨāĻž āϘāĻžāĻŽāĻžāϝāĻŧ āύāĻžāĨ¤

āφāĻĒāύāĻŋ āϤāĻŋāύāϟāĻŋ āĻĒā§āϰāϧāĻžāύ āϏ⧁āĻŦāĻŋāϧāĻž āĻĒāĻžāĻŦ⧇āύ:

  • āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āϤāĻžā§ŽāĻ•ā§āώāĻŖāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĒāĻžāύāĨ¤ ShouldQueue āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ­āĻžāϰ⧀ āĻ•āĻžāϜāϗ⧁āϞ⧋ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄā§‡ āϚāϞ⧇āĨ¤
  • āϰ⧇āϜāĻŋāϞāĻŋāϝāĻŧ⧇āĻ¨ā§āϏ (Resilience): āϝāĻĻāĻŋ āϕ⧋āύ⧋ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻĄāĻžāωāύ āĻĨāĻžāϕ⧇, āϤāĻŦ⧇ āϞāĻŋāϏ⧇āύāĻžāϰ āĻŽā§‚āϞ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āύāĻˇā§āϟ āύāĻž āĻ•āϰ⧇āχ āĻ•āĻžāϜāϟāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž (retry) āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤
  • āĻāĻ•ā§āϏāĻŸā§‡āύāϏāĻŋāĻŦāĻŋāϞāĻŋāϟāĻŋ (Extensibility): āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āϞāĻŋāϏ⧇āύāĻžāϰ āϝ⧋āĻ— āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒ⧁āĻļ āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ⧇āϰ āĻŽāϤ⧋ āύāϤ⧁āύ āĻĢāĻŋāϚāĻžāϰ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āφāĻĒāύāĻžāϕ⧇ āĻŽā§‚āϞ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰāϟāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āύāĻžāĨ¤

āĻ…āύ⧁āϏāϰāĻŖā§€āϝāĻŧ āϏ⧇āϰāĻž āĻ…āύ⧁āĻļā§€āϞāύāϏāĻŽā§‚āĻš (Best practices):

  • āϏāĻžāχāĻĄ āχāĻĢ⧇āĻ•ā§āĻŸā§‡āϰ āĻ“āĻĒāϰ āϗ⧁āϰ⧁āĻ¤ā§āĻŦ āĻĻāĻŋāύ: āĻĒā§‹āĻ¸ā§āϟ-āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āχāϭ⧇āĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āϝ⧇ āϕ⧋āϰ āϞāϜāĻŋāĻ• āϤāĻžā§ŽāĻ•ā§āώāĻŖāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāĻ“āϝāĻŧāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ, āϏ⧇āϟāĻŋāϰ āϜāĻ¨ā§āϝ āχāϭ⧇āĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āύāĻžāĨ¤
  • āĻŦāĻ°ā§āĻŖāύāĻžāĻŽā§‚āϞāĻ• āύāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ: OrderPlaced āĻŦāĻž UserRegistered-āĻāϰ āĻŽāϤ⧋ āĻĒāĻžāĻ¸ā§āϟ-āĻŸā§‡āύāϏ (past-tense) āύāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āϝ⧇ āĻ•āĻžāϜāϟāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāϝāĻŧ⧇āϛ⧇āĨ¤
  • āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻ…ā§āϝāĻžāĻŦāĻ¸ā§āĻŸā§āϰāĻžāĻ•āĻļāύ (over-abstraction) āĻāĻĄāĻŧāĻŋāϝāĻŧ⧇ āϚāϞ⧁āύ: āϝāĻĻāĻŋ āϕ⧋āĻĄā§‡āϰ āĻāĻ•āϟāĻŋ āĻ…āĻ‚āĻļ āϏāĻšāϜ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϕ⧇āĻŦāϞ āĻāĻ• āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ, āϤāĻŦ⧇ āχāϭ⧇āĻ¨ā§āĻŸā§‡āϰ āĻšā§‡āϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āĻĢāĻžāĻ‚āĻļāύ āĻ•āϞ āĻ•āϰāĻž āĻ­āĻžāϞ⧋āĨ¤

āĻĄā§‡āϟāĻžāĻŦ⧇āϏ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āϜāĻ¨ā§āϝ Eloquent Observers āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻŦāĻŋāϜāύ⧇āϏ āĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ Events āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

āχāϭ⧇āĻ¨ā§āĻŸā§‡ āϰāĻŋāĻĢā§āϝāĻžāĻ•ā§āϟāϰ āĻ•āϰāĻž āĻŽāĻžāύ⧇ āĻšāϞ⧋ āĻ¸ā§āĻĨāĻžāϝāĻŧāĻŋāĻ¤ā§āĻŦ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻžāĨ¤ āĻāϟāĻŋ āφāĻĒāύāĻžāϰ āϕ⧋āĻĄāϕ⧇ āĻĄāĻŋāĻŦāĻžāĻ— āĻ•āϰāĻž āϏāĻšāϜ āĻāĻŦāĻ‚ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāĻž āĻĻā§āϰ⧁āϤ āĻ•āϰ⧇ āϤ⧋āϞ⧇āĨ¤

āφāϜāχ āφāĻĒāύāĻžāϰ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āϜāϟāĻŋāϞ āĻŦāĻž 'noisy' āϏāĻžāχāĻĄ āχāĻĢ⧇āĻ•ā§āϟ āĻŦ⧇āϛ⧇ āύāĻŋāύ āĻāĻŦāĻ‚ āϏ⧇āϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āϞāĻŋāϏ⧇āύāĻžāϰ⧇ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ āĻ•āϰ⧁āύāĨ¤

āĻāχ āĻ¸ā§āϝāĻžāĻ¨ā§āĻĄāĻŦāĻ•ā§āϏ āωāĻĻāĻžāĻšāϰāĻŖāϟāĻŋ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇ āĻĻ⧇āϖ⧁āύ: https://onlinephp.io/c/1f7b2

āĻĢā§āϝāĻžāϟ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻĨ⧇āϕ⧇ āĻĻā§‚āϰ⧇: āϞāĻžāϰāĻžāϭ⧇āϞ⧇ āχāϭ⧇āĻ¨ā§āϟ-āĻĄā§āϰāĻŋāϭ⧇āύ āĻĄāĻŋāĻ•āĻžāĻĒāϞāĻŋāĻ‚ā§Ÿā§‡ āĻĻāĻ•ā§āώāϤāĻž āĻ…āĻ°ā§āϜāύ

āϏāĻŽāĻ¸ā§āϝāĻž: "āĻĢā§āϝāĻžāϟ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ" āĻ…ā§āϝāĻžāĻ¨ā§āϟāĻŋ-āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ

āφāĻĒāύāĻžāϰ āϞāĻžāϰāĻžāϭ⧇āϞ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āϝāĻ–āύ āĻŦ⧜ āĻšāϤ⧇ āĻĨāĻžāϕ⧇, āφāĻĒāύāĻŋ āĻšā§ŸāϤ⧋ āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰāĻŦ⧇āύ āϝ⧇ āφāĻĒāύāĻžāϰ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰāϗ⧁āϞ⧋ āĻĻāĻŋāύ āĻĻāĻŋāύ āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ Bloated āĻŦāĻž āϜāϟāĻŋāϞ āĻšā§Ÿā§‡ āωāĻ āϛ⧇āĨ¤ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϘāϟāύāĻž āϝāĻž "Fat Controller" āĻ…ā§āϝāĻžāĻ¨ā§āϟāĻŋ-āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻĒāϰāĻŋāϚāĻŋāϤāĨ¤ āĻāĻ•āϟāĻŋ āĻĢā§āϝāĻžāϟ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻšāϞ⧋ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āϝāĻž āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āĻĻāĻžā§ŸāĻŋāĻ¤ā§āĻŦ āĻĒāĻžāϞāύ āĻ•āĻ°ā§‡â€”āϝ⧇āĻŽāύ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ āĻ•āϰāĻž, āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻž, āĻĨāĻžāĻ°ā§āĻĄ-āĻĒāĻžāĻ°ā§āϟāĻŋ āĻāĻĒāĻŋāφāχ āĻ•āϞ āĻ•āϰāĻž, āχāĻŽā§‡āχāϞ āĻĒāĻžāĻ āĻžāύ⧋ āĻāĻŦāĻ‚ āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻ•āĻŋāĻ›ā§â€”āϏāĻŦāχ āĻāĻ•āϟāĻŋ āĻŽāĻžāĻ¤ā§āϰ āĻŽā§‡āĻĨāĻĄā§‡āϰ āĻŽāĻ§ā§āϝ⧇āĨ¤ āĻāϰ āĻĢāϞ⧇ āϕ⧋āĻĄ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāĻž, āĻŽā§‡āχāύāĻŸā§‡āχāύ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻ¸ā§āϕ⧇āϞ āĻ•āϰāĻž āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āĻ•āĻ āĻŋāύ āĻšā§Ÿā§‡ āĻĒā§œā§‡āĨ¤

āϏāĻŽāĻžāϧāĻžāύ: āχāϭ⧇āĻ¨ā§āϟ-āĻĄā§āϰāĻŋāϭ⧇āύ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĄāĻŋāĻ•āĻžāĻĒāϞāĻŋāĻ‚

āĻĄāĻŋāĻ•āĻžāĻĒāϞāĻŋāĻ‚ (Decoupling) āĻšāϞ⧋ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ…āĻ‚āĻļ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āύāĻŋāĻ°ā§āĻ­āϰāĻļā§€āϞāϤāĻž (dependency) āĻ•āĻŽāĻŋā§Ÿā§‡ āφāύāĻžāϰ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•ā§āϰāĻŋ⧟āĻžāĨ¤ āϝāĻ–āύ āĻāĻ•āϟāĻŋ āĻ…āĻ‚āĻļ āĻ…āĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ…āĻ‚āĻļ⧇āϰ āĻ“āĻĒāϰ āϏāϰāĻžāϏāϰāĻŋ āύāĻŋāĻ°ā§āĻ­āϰ āύāĻž āĻ•āϰ⧇, āϤāĻ–āύ āφāĻŽāϰāĻž āĻŦāϞāĻŋ āϝ⧇ āϤāĻžāϰāĻž 'decoupled'āĨ¤ āĻĄāĻŋāĻ•āĻžāĻĒāϞāĻŋāĻ‚ā§Ÿā§‡āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻāĻ•āϟāĻŋ āĻ…āĻ‚āĻļ āĻ…āĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ…āĻ‚āĻļāϕ⧇ āϏāϰāĻžāϏāϰāĻŋ āĻ•āϞ āĻ•āϰāĻžāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇, āϤāĻžāϰāĻž āχāϭ⧇āĻ¨ā§āĻŸā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧇āĨ¤

āχāϭ⧇āĻ¨ā§āϟ-āĻĄā§āϰāĻŋāϭ⧇āύ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ (Event-Driven Architecture - EDA) āφāĻĒāύāĻžāϕ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇ āϕ⧋āύ⧋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āϘāϟāύāĻž āϘāϟāϞ⧇ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāĻžāϰ āϏ⧁āĻŦāĻŋāϧāĻž āĻĻā§‡ā§ŸāĨ¤ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…āĻ‚āĻļ āϏ⧇āχ āχāϭ⧇āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ "listen" āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āϏ⧇āχ āĻ…āύ⧁āϝāĻžā§Ÿā§€ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϝ⧇āĻ–āĻžāύ⧇ āĻŽā§‚āϞ āĻ…āĻ‚āĻļāϟāĻŋ āϜāĻžāύāϤ⧇āχ āĻĒāĻžāϰ⧇ āύāĻž āϝ⧇ āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ āĻ…āĻ‚āĻļ āϏ⧇āχ āĻ•āĻžāϜ āĻ•āϰāϛ⧇āĨ¤

āϞāĻžāϰāĻžāϭ⧇āϞ⧇ āχāϭ⧇āĻ¨ā§āϟ āĻāĻŦāĻ‚ āϞāĻŋāϏ⧇āύāĻžāϰ āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāĻž

āϞāĻžāϰāĻžāϭ⧇āϞ āϤāĻžāϰ āĻŦāĻŋāĻ˛ā§āϟ-āχāύ Event āĻāĻŦāĻ‚ Listener āĻ•ā§āϞāĻžāϏāϗ⧁āϞ⧋āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻāχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύāϟāĻŋ āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāĻž āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āϏāĻšāϜ āĻ•āϰ⧇ āϤ⧁āϞ⧇āϛ⧇āĨ¤

āϧāĻžāĻĒ ā§§: āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž

āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āĻšāϞ⧋ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻ•ā§āϞāĻžāϏ āϝāĻž āϘāϟāĻž āϘāϟāύāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āĻĄāĻžāϟāĻž āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤ php artisan make:event UserRegistered

āϧāĻžāĻĒ ā§¨: āĻāĻ•āϟāĻŋ āϞāĻŋāϏ⧇āύāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž

āĻāĻ•āϟāĻŋ āϞāĻŋāϏ⧇āύāĻžāϰ āĻšāϞ⧋ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāϏ āϝāĻž āχāϭ⧇āĻ¨ā§āϟāϟāĻŋ āĻĢāĻžā§ŸāĻžāϰ āĻšāĻ“ā§ŸāĻžāϰ āĻĒāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻžāϜ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰ⧇āĨ¤ php artisan make:listener SendWelcomeEmail --event=UserRegistered

āϧāĻžāĻĒ ā§Š: āϏ⧇āϗ⧁āϞ⧋ āϰ⧇āϜāĻŋāĻ¸ā§āϟāĻžāϰ āĻ•āϰāĻž

āϞāĻžāϰāĻžāϭ⧇āϞ⧇, āφāĻĒāύāĻŋ āĻāϗ⧁āϞ⧋ EventServiceProvider-āĻ āϰ⧇āϜāĻŋāĻ¸ā§āϟāĻžāϰ āĻ•āϰ⧇āύāĨ¤

āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āωāĻĻāĻžāĻšāϰāĻŖ: āχāωāϜāĻžāϰ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰ⧇āĻļāύ

āϚāϞ⧁āύ āĻāĻ•āϟāĻŋ "āĻĢā§āϝāĻžāϟ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ" āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ "āχāϭ⧇āĻ¨ā§āϟ-āĻĄā§āϰāĻŋāϭ⧇āύ" āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āĻĻ⧇āĻ–āĻŋāĨ¤

āĻĢā§āϝāĻžāϟ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ (āĻ–āĻžāϰāĻžāĻĒ āĻ…āĻ­ā§āϝāĻžāϏ)

public function store(Request $request)
{
    // ā§§. āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ
    $validated = $request->validate([...]);

    // ⧍. āχāωāϜāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž
    $user = User::create($validated);

    // ā§Š. āĻ“ā§Ÿā§‡āϞāĻ•āĻžāĻŽ āχāĻŽā§‡āχāϞ āĻĒāĻžāĻ āĻžāύ⧋
    Mail::to($user)->send(new WelcomeEmail($user));

    // ā§Ē. āχāωāϜāĻžāϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰāĻž
    Profile::create(['user_id' => $user->id]);

    // ā§Ģ. āĻ…ā§āϝāĻžāĻ•ā§āϟāĻŋāĻ­āĻŋāϟāĻŋ āϞāĻ— āĻ•āϰāĻž
    Log::info('New user registered: ' . $user->email);

    return redirect()->route('dashboard');
}

āχāϭ⧇āĻ¨ā§āϟ-āĻĄā§āϰāĻŋāϭ⧇āύ āĻĒāĻĻā§āϧāϤāĻŋ (āϏ⧇āϰāĻž āĻ…āĻ­ā§āϝāĻžāϏ)

public function store(Request $request)
{
    // ā§§. āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ
    $validated = $request->validate([...]);

    // ⧍. āχāωāϜāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž
    $user = User::create($validated);

    // ā§Š. āχāϭ⧇āĻ¨ā§āϟ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž
    event(new UserRegistered($user));

    return redirect()->route('dashboard');
}

āĻāĻ–āύ, UserRegistered āχāϭ⧇āĻ¨ā§āϟāϟāĻŋ āĻāĻ•āĻžāϧāĻŋāĻ• āϞāĻŋāϏ⧇āύāĻžāϰ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇:

  • SendWelcomeEmail
  • CreateUserProfile
  • LogUserRegistration

āφāϰāĻ“ āωāĻ¨ā§āύāϤ āĻĒāĻ°ā§āϝāĻžā§Ÿā§‡: āĻ…āĻŦāϜāĻžāϰāĻ­āĻžāϰ āĻāĻŦāĻ‚ āĻ•āĻŋāω (Observers and Queues)

  • Observers: āφāĻĒāύāĻŋ