הקונטרולר שלכם עושה את העבודה הלא נכונה

פתחו את ה-controller שלכם. חפשו מתודת store.

האם יש בו 40 שורות קוד? האם אתם רואים בלוק validation ענק, כמה משפטי if, לוגיקה עסקית (business logic), ואז משפט return?

הקונטרולר שלכם עושה עבודה שהוא לא אמור לעשות.

לקונטרולר יש עבודה אחת. הוא מקבל בקשה (request), קורא ל-service כדי לפתור את הבעיה, ומחזיר תגובה (response). הוא המלצר, לא השף.

כשמכניסים validation ו-authorization לתוך קונטרולר, זה הופך לבלגן. אתם מסיימים עם 80 שורות קוד שאף אחד לא רוצה לגעת בהן.

ל-Laravel יש פתרון מובנה: Form Requests.

תבנית רעה נפוצה נראית כך:

  • וולידציה (validation) של נתוני קלט
  • בדיקת הרשאות משתמש
  • טרנספורמציה (transforming) של נתונים
  • הרצת לוגיקה עסקית (business logic)

זה שובר את עקרון האחריות היחידה (Single Responsibility Principle). למחלקה (class) צריכה להיות רק סיבה אחת להשתנות. קונטרולר משתנה כשהזרמת הבקשות (request flow) משתנה. הוא לא אמור להשתנות רק בגלל שכלל וולידציה השתנה.

השתמשו בפקודה הזו כדי לתקן זאת: php artisan make:request StorePostRequest

זה יוצר קובץ ייעודי ללוגיקת הבקשה שלכם. העבירו את שלושת הדברים האלו לתוך ה-Form Request:

  • Authorization: השתמשו במתודה authorize() כדי לבדוק הרשאות.
  • Validation: השתמשו במתודה rules() כדי להגדיר את דרישות הנתונים שלכם.
  • Data Preparation: השתמשו ב-prepareForValidation() כדי לנקות או לעצב נתונים לפני ה-validation.

עכשיו הביטו שוב בקונטרולר שלכם:

public function store(StorePostRequest $request)
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

הקונטרולר עכשיו באורך שתי שורות. הוא שוב מתנהג כמו מלצר.

Laravel מריצה את ה-authorization וה-validation באופן אוטומטי עוד לפני שהמתודה בקונטרולר מתחילה. אם ה-validation נכשל, המשתמש מקבל שגיאה באופן מיידי.

עקבו אחר ההנחיות הבאות:

  • שמרו על validation inline אם הוא קצר ומשמש רק במקום אחד.
  • השתמשו ב-Form Request אם ה-validation גדל, חוזר על עצמו, או כולל authorization.
  • אל תכניסו לוגי