コントローラーの仕事が多すぎます
コントローラーを開いて、store メソッドを見てください。
40行ものコードがありますか?巨大なバリデーションブロックから始まり、いくつかの if 文が続き、ビジネスロジックがあり、最後に return する……といった感じでしょうか?
あなたのコントローラーは、本来の役割ではない仕事をしています。
コントローラーの役割はシンプルです。リクエストを受け取り、問題を解決するためにサービスを呼び出し、レスポンスを返します。ウェイターを想像してください。ウェイターは料理を運びますが、料理を作るわけではありません。
バリデーション、認可、データ処理をコントローラーの中に詰め込むと、コードは混乱します。誰も触りたくなくなるような、80行もの「モンスター」が出来上がってしまいます。
Laravelには、組み込みの解決策があります。それが「Form Request」です。
すべてのメソッドでバリデーションや認可のロジックを繰り返すのはやめましょう。「単一責任の原則(Single Responsibility Principle)」に従ってください。クラスが変更される理由は、たった一つであるべきです。コントローラーはリクエストの流れが変わったときに変更されるべきものであり、バリデーションルールが変わっただけで変更されるべきではありません。
専用のリクエストクラスを作成するには、次のコマンドを実行します:
php artisan make:request StorePostRequest
ロジックをこの新しいクラスに移動させます。Form Requestは主に以下の3つのことを処理します:
• 認可 (Authorization): authorize メソッドを使用して、ユーザーがアクションを実行できるかどうかを決定します。false を返すと、Laravelは自動的に 403 エラーを返します。
• バリデーション (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 を使うわけではありません。単純なフィールドが1つしかないような小さなルートであれば、バリデーションはインラインのままにしておきましょう。ロジックが複雑になったり、重複したり、権限が絡んだりする場合に Form Request を使用してください。
また、Form Request にビジネスロジックを詰め込まないでください。計算やデータベースの更新は、サービス層(Service layer)で行うべきです。
今日、一番散らかったコントローラーを見つけてください。バリデーションを Form Request に抽出しましょう。コードがスリムになっていくのを実感できるはずです。
あなたが今まで見た中で、最も巨大な store メソッドはどのようなものでしたか?ぜひコメントで教えてください。
Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o
