コントローラーが本来の役割を果たしていません

コントローラーを開いてください。store メソッドを探してみましょう。

40行ものコードが書かれていませんか?巨大なバリデーションブロック、いくつもの if 文、ビジネスロジック、そして最後に return 文……といった構成になっていませんか?

あなたのコントローラーは、本来すべきではない仕事をしています。

コントローラーの仕事は一つだけです。リクエストを受け取り、問題を解決するためにサービスを呼び出し、レスポンスを返すこと。コントローラーは「ウェイター」であって、「シェフ」ではありません。

コントローラーの中にバリデーションや認可(authorization)を詰め込むと、コードは混乱します。結果として、誰も触りたくなくなるような80行ものコードが出来上がってしまいます。

Laravel には、これに対する組み込みの解決策があります。それが Form Request です。

よくある悪いパターンは以下の通りです:

  • 入力データのバリデーション
  • ユーザー権限のチェック
  • データの変換
  • ビジネスロジックの実行

これは単一責任の原則(Single Responsibility Principle)に反します。クラスが変更される理由は、たった一つであるべきです。コントローラーはリクエストの流れが変わったときに変更されるべきものであり、バリデーションルールが変わっただけで変更されるべきではありません。

これを修正するには、次のコマンドを使用します: php artisan make:request StorePostRequest

これにより、リクエストロジック専用のファイルが作成されます。以下の3つの要素を Form Request に移動しましょう:

  • 認可(Authorization):authorize() メソッドを使用して権限をチェックします。
  • バリデーション(Validation):rules() メソッドを使用してデータの要件を定義します。
  • データ準備(Data Preparation):prepareForValidation() を使用して、バリデーション前にデータをクレンジングまたはフォーマットします。

さて、もう一度コントローラーを見てみましょう:

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

コントローラーはわずか2行になりました。再びウェイターのように振る舞っています。

Laravel は、コントローラーのメソッドが開始される前に、認可とバリデーションを自動的に実行します。バリデーションに失敗した場合、ユーザーには即座にエラーが返されます。

以下のガイドラインに従ってください:

  • バリデーションが短く、一箇所でしか使われない場合は、インラインのままにしておきます。
  • バリデーションが肥大化したり、重複したり、あるいは認可を含む場合は、Form Request を使用します。
  • Form Request にビジネスロジックを記述しないでください。それには Service レイヤーを使用します。

今日、一番ぐちゃぐちゃなコントローラーを見つけてください。バリデーションを Form Request に抽出しましょう。コードがスリムになっていくのを実感できるはずです。

あなたがこれまでに見た中で、最も長い store メソッドはどれくらいでしたか?ぜひコメントで教えてください。

Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o