📝
【Laravel】コントローラでデータを生成・保存するロジックを直接書くのではなく、モデルにその責任を持たせる
下記のようにコントローラーにデータを生成・保存するロジックを書いてしまうのではなく、
// app/Http/Controllers/ProjectController.php
public function store(ProjectRequest $request)
{
$user = auth()->user();
$current_team = Team::find($user->selected_team_id);
$project = new Project();
$project->name = $request->name;
$project->team_id = $current_team->id;
$project->user_id = $user->id;
$project->save();
return redirect()->back();
}
モデルにデータを生成・保存するメソッドを定義してコントローラーで呼び出す
// app/Models/Project.php
public static function createProject($user, $current_team, $name)
{
$project = new Project();
$project->name = $name;
$project->team_id = $current_team->id;
$project->user_id = $user->id;
$project->save();
return $project;
}
// app/Http/Controllers/ProjectController.php
public function store(ProjectRequest $request)
{
$user = auth()->user();
$current_team = $user->selectedTeam()->first();
Project::createProject($user, $current_team, $request->name);
return redirect()->back();
}
以下理由
データ生成・保存をコントローラに書かない理由
-
関心の分離 (Separation of Concerns):
- コントローラの責務: ユーザーリクエストの受け取りとレスポンスの生成。
- モデルの責務: データの生成・保存・操作などのビジネスロジック。
- コントローラにデータ生成・保存のロジックを書くと、コントローラが肥大化し、コードの可読性と保守性が低下します。
-
再利用性の向上:
- データ生成・保存のロジックをモデルに集約することで、他のコントローラやサービスからも同じロジックを再利用できます。
-
テストの容易性:
- モデルにビジネスロジックを集中させることで、そのロジックを個別にテストしやすくなります。
Project::createProject($user, $current_team, $request->name)
の利点
-
明確なインターフェース:
-
createProject
メソッドの引数としてUser
、Team
、string
を指定することで、必要な情報が明確になり、誤ったデータの入力を防ぎます。 - 引数が明確なので、ドキュメントを読まなくても必要な情報がすぐにわかります。
-
-
一貫性のあるデータ生成:
- データ生成のロジックが一箇所に集約されるため、どこからでも一貫した方法でプロジェクトを生成できます。
- 各コントローラで異なる方法でデータを生成することがなくなります。
-
保守性の向上:
- データ生成ロジックを変更する必要がある場合、モデル内の
createProject
メソッドだけを変更すれば済みます。これにより、コードの保守が容易になります。
- データ生成ロジックを変更する必要がある場合、モデル内の
create
やsave
を直接使うことの問題点
標準の-
あいまいさ:
- 標準の
create
やsave
メソッドは柔軟性が高いため、最低限の型が合えばどんなデータでも保存できます。これにより、間違ったデータが保存されるリスクがあります。
- 標準の
-
重複と一貫性の欠如:
- コントローラごとにデータ生成ロジックを書いていると、似たようなコードが複数箇所に存在し、微妙に異なる実装がされることがあります。これにより、コードの重複が発生し、バグの温床となります。
まとめ
モデルにデータ生成・保存のロジックを移すことで、コードの明確性、一貫性、保守性、再利用性が向上します。これにより、誤ったデータ操作を防ぎ、コードの品質を高めることができます。特に複雑なビジネスロジックを含むアプリケーションでは、このアプローチが非常に有効です。
Discussion