𝗠𝗮𝘀𝘁𝗲𝗿𝗶𝗻𝗴 𝗘𝘃𝗲𝗻𝘁-𝗗𝗿𝗶𝘃𝗲𝗻 𝗗𝗲𝗰𝗼𝘂𝗽𝗹𝗶𝗻𝗴 𝗶𝗻 𝗟𝗮𝗿𝗮𝘃𝗲𝗹

ನಿಮ್ಮ Laravel controllersಗಳು ಹೆಚ್ಚಾಗಿ business logic ಅನ್ನು ಹಾಕುವ ಜಾಗಗಳಾಗಿ (dumping grounds) ಬದಲಾಗುತ್ತವೆ.

ನೀವು ಒಂದು ಸರಳವಾದ registration flow ನೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸುತ್ತೀರಿ. ಶೀಘ್ರದಲ್ಲೇ, ನೀವು ಒಂದೇ method ಗೆ email notifications, Slack alerts, audit logs ಮತ್ತು API calls ಗಳನ್ನು ಸೇರಿಸುತ್ತೀರಿ. ಇದು ಒಂದು 'fat controller' ಅನ್ನು ಸೃಷ್ಟಿಸುತ್ತದೆ.

Fat controllers ನಿಮ್ಮ ಕೋಡ್ ಅನ್ನು ದುರ್ಬಲಗೊಳಿಸುತ್ತವೆ (fragile). ಅವುಗಳನ್ನು ಪರೀಕ್ಷಿಸುವುದು (test ಮಾಡುವುದು) ಕಷ್ಟ. ಅವು Single Responsibility Principle ಅನ್ನು ಉಲ್ಲಂಘಿಸುತ್ತವೆ.

ಇದನ್ನು ಸರಿಪಡಿಸಲು ನಿಮಗೆ RabbitMQ ನಂತಹ ಸಂಕೀರ್ಣ ಪರಿಕರಗಳ ಅಗತ್ಯವಿಲ್ಲ. ಹೆಚ್ಚಿನ ಅಗತ್ಯಗಳಿಗೆ ಕೆಲಸ ಮಾಡುವ ಅಂತರ್ನಿರ್ಮಿತ (built-in) event system ಅನ್ನು Laravel ಹೊಂದಿದೆ.

Tight coupling ನ ಸಮಸ್ಯೆಗಳು: ಒಂದು ವೇಳೆ newsletter API ನಿಧಾನವಾಗಿದ್ದರೆ, ನಿಮ್ಮ user registration ಕೂಡ ನಿಧಾನವಾಗುತ್ತದೆ. ಒಂದು ವೇಳೆ mail service ವಿಫಲವಾದರೆ, ಇಡೀ request ವಿಫಲವಾಗುತ್ತದೆ.

ಪರಿಹಾರ: Event-Driven Architecture.

Events ಮಧ್ಯಂತರ ಪದರವಾಗಲಿ (middle layer) ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ. ನಿಮ್ಮ controller ಒಂದು ಕ್ರಿಯೆಯನ್ನು (action) ಘೋಷಿಸುತ್ತದೆ. 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: ಬಳಕೆದಾರರಿಗೆ ತಕ್ಷಣವೇ ಪ್ರತಿಕ್ರಿಯೆ (response) ಸಿಗುತ್ತದೆ. ShouldQueue interface ಬಳಸಿ ಭಾರೀ ಕೆಲಸಗಳನ್ನು (heavy tasks) ಹಿನ್ನೆಲೆಯಲ್ಲಿ (background) ನಡೆಸಬಹುದು.
  • Resilience: ಒಂದು service ಸ್ಥಗಿತಗೊಂಡಿದ್ದರೆ, ಮುಖ್ಯ ಅಪ್ಲಿಕೇಶನ್ ವಿಫಲವಾಗದಂತೆ listener ಆ ಕೆಲಸವನ್ನು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಬಹುದು (retry).
  • Extensibility: ಹೊಸ listener ಅನ್ನು ಸೇರಿಸುವ ಮೂಲಕ push notifications ನಂತಹ ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನೀವು ಸೇರಿಸಬಹುದು. ನೀವು ಮೂಲ controller ಅನ್ನು ಬದಲಾಯಿಸುವ ಅಗತ್ಯವಿಲ್ಲ.

ಅನುಸರಿಸಬೇಕಾದ ಉತ್ತಮ ಪದ್ಧತಿಗಳು (Best practices):

  • Side effects ಮೇಲೆ ಗಮನಹರಿಸಿ: Post-processing ಗಾಗಿ events ಬಳಸಿ. ತಕ್ಷಣವೇ ನಡೆಯಬೇಕಾದ core logic ಗಾಗಿ ಅವುಗಳನ್ನು ಬಳಸಬೇಡಿ.
  • ವಿವರಣಾತ್ಮಕ ಹೆಸರುಗಳನ್ನು ಬಳಸಿ: OrderPlaced ಅಥವಾ UserRegistered ನಂತಹ ಭೂತಕಾಲದ (past-tense) ಹೆಸರುಗಳನ್ನು ಬಳಸಿ. ಇದು ಕ್ರಿಯೆಯು ಈಗಾಗಲೇ ನಡೆದಿದೆ ಎಂದು ತೋರಿಸುತ್ತದೆ.
  • Over-abstraction ಅನ್ನು ತಪ್ಪಿಸಿ: ಒಂದು ಕೋಡ್ ಸರಳವಾಗಿದ್ದು ಕೇವಲ ಒಂದು ಕಡೆ ಮಾತ್ರ ಬಳಕೆಯಾಗುತ್ತಿದ್ದರೆ, event ಗಿಂತ function call ಉತ್ತಮವಾಗಿದೆ.

Database ಬದಲಾವಣೆಗಳಿಗಾಗಿ Eloquent Observers ಬಳಸಿ. Business actions ಗಾಗಿ Events ಬಳಸಿ.

Events ಗೆ refactoring ಮಾಡುವುದು ಬಾಳಿಕೆದಾರಿತಕ್ಕೆ (durability) ಸಂಬಂಧಿಸಿದೆ. ಇದು ನಿಮ್ಮ ಕೋಡ್ ಅನ್ನು debug ಮಾಡುವುದನ್ನು ಸುಲಭಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಪರೀಕ್ಷಿಸುವುದನ್ನು (test) ವೇಗಗೊಳಿಸುತ್ತದೆ.

ನಿಮ್ಮ controller ನಲ್ಲಿರುವ ಒಂದು ಗೊಂದಲಮಯ side effect ಅನ್ನು ಇಂದೇ ಆರಿಸಿ ಮತ್ತು ಅದನ್ನು listener ಗೆ ವರ್ಗಾಯಿಸಿ.

ಈ sandbox ಉದಾಹರಣೆಯನ್ನು ಪ್ರಯತ್ನಿಸಿ: https://onlinephp.io/c/1f7b2

ಫ್ಯಾಟ್ ಕಂಟ್ರೋಲರ್‌ಗಳ ಆಚೆಗಿನ ಲೋಕ: Laravel ನಲ್ಲಿ ಇವೆಂಟ್-ಡ್ರಿವನ್ ಡಿಕಪಲಿಂಗ್‌ನಲ್ಲಿ ಪರಿಣಿತರಾಗುವುದು

ವೆಬ್ ಅಭಿವೃದ್ಧಿಯ ಜಗತ್ತಿನಲ್ಲಿ, ವಿಶೇಷವಾಗಿ Laravel ನಂತಹ ಫ್ರೇಮ್‌ವರ್ಕ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ, ನೀವು 'Fat Controllers' ಎಂಬ ಪದವನ್ನು ಎದುರಿಸಿರಬಹುದು. ಇದು ನಿಮ್ಮ ಕಂಟ್ರೋಲರ್ ಕ್ಲಾಸ್‌ಗಳು ಅತಿಯಾದ ಬಿಸಿನೆಸ್ ಲಾಜಿಕ್‌ನಿಂದ ತುಂಬಿಹೋಗುವ ಪರಿಸ್ಥಿತಿಯನ್ನು ಸೂಚಿಸುತ್ತದೆ, ಇದರಿಂದ ಅವುಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು, ಪರೀಕ್ಷಿಸುವುದು ಮತ್ತು ಸ್ಕೇಲ್ ಮಾಡುವುದು ಕಷ್ಟವಾಗುತ್ತದೆ.

ಸಮಸ್ಯೆ: ಫ್ಯಾಟ್ ಕಂಟ್ರೋಲರ್‌ಗಳು (Fat Controllers)

ಒಂದು ಕಂಟ್ರೋಲರ್ ವ್ಯಾಲಿಡೇಶನ್‌ನಿಂದ ಹಿಡಿದು ಡೇಟಾಬೇಸ್ ಕಾರ್ಯಾಚರಣೆಗಳು ಮತ್ತು ಇಮೇಲ್ ಕಳುಹಿಸುವವರೆಗೆ ಎಲ್ಲವನ್ನೂ ನಿರ್ವಹಿಸಿದಾಗ, ಅದು Single Responsibility Principle (SRP) ಅನ್ನು ಉಲ್ಲಂಘಿಸುತ್ತದೆ. ಇದು ಈ ಕೆಳಗಿನವುಗಳಿಗೆ ಕಾರಣವಾಗುತ್ತದೆ:

  • ನಿರ್ವಹಿಸಲು ಕಷ್ಟವಾದ ಕೋಡ್ (Hard to maintain code).
  • ಯೂನಿಟ್ ಟೆಸ್ಟ್‌ಗಳನ್ನು ಬರೆಯಲು ಕಷ್ಟ (Difficult to write unit tests).
  • ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡುವಾಗ ಬಗ್‌ಗಳಾಗುವ ಹೆಚ್ಚಿನ ಅಪಾಯ (High risk of bugs when making changes).

ಪರಿಹಾರ: ಇವೆಂಟ್-ಡ್ರಿವನ್ ಡಿಕಪಲಿಂಗ್ (Event-Driven Decoupling)

ಇವೆಂಟ್-ಡ್ರಿವನ್ ಆರ್ಕಿಟೆಕ್ಚರ್ (Event-driven architecture) ಏನಾದರೂ ನಡೆದಾಗ ಒಂದು ಇವೆಂಟ್ ಅನ್ನು ಟ್ರಿಗ್ಗರ್ ಮಾಡಲು ಮತ್ತು ನಂತರ ಹಲವಾರು ಲಿಸನರ್‌ಗಳು (listeners) ಆ ಇವೆಂಟ್ ಗೆ ಸ್ವತಂತ್ರವಾಗಿ ಪ್ರತಿಕ್ರಿಯಿಸುವಂತೆ ಮಾಡುತ್ತದೆ.

ಉದಾಹರಣೆ: ಬಳಕೆದಾರರ ನೋಂದಣಿ (User Registration)

ನಿಮ್ಮ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್‌ನಲ್ಲಿ ಒಬ್ಬ ಬಳಕೆದಾರರು ನೋಂದಾಯಿಸಿಕೊಳ್ಳುತ್ತಾರೆ ಎಂದು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ. ನೀವು ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಮಾಡಬೇಕಾಗುತ್ತದೆ:

  1. ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವುದು.
  2. ಸ್ವಾಗತ ಇಮೇಲ್ ಕಳುಹಿಸುವುದು.
  3. ಅಡ್ಮಿನ್ (Admin) ಗೆ ತಿಳಿಸುವುದು.
  4. ಬಳಕೆದಾರರ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸುವುದು.

ಫ್ಯಾಟ್ ಕಂಟ್ರೋಲರ್‌ನಲ್ಲಿ, ಈ ಎಲ್ಲಾ ಹಂತಗಳು register ಮೆಥಡ್‌ನ ಒಳಗಿರುತ್ತವೆ.

public function register(Request $request) {
    // Validate
    // Create User
    //