コントローラーが本来の役割を果たしていません
コントローラーを開いてください。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
