📝

【Laravel】コントローラでデータを生成・保存するロジックを直接書くのではなく、モデルにその責任を持たせる

2024/05/31に公開

下記のようにコントローラーにデータを生成・保存するロジックを書いてしまうのではなく、

// 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();
}

以下理由

データ生成・保存をコントローラに書かない理由

  1. 関心の分離 (Separation of Concerns):

    • コントローラの責務: ユーザーリクエストの受け取りとレスポンスの生成。
    • モデルの責務: データの生成・保存・操作などのビジネスロジック。
    • コントローラにデータ生成・保存のロジックを書くと、コントローラが肥大化し、コードの可読性と保守性が低下します。
  2. 再利用性の向上:

    • データ生成・保存のロジックをモデルに集約することで、他のコントローラやサービスからも同じロジックを再利用できます。
  3. テストの容易性:

    • モデルにビジネスロジックを集中させることで、そのロジックを個別にテストしやすくなります。

Project::createProject($user, $current_team, $request->name) の利点

  1. 明確なインターフェース:

    • createProjectメソッドの引数としてUserTeamstringを指定することで、必要な情報が明確になり、誤ったデータの入力を防ぎます。
    • 引数が明確なので、ドキュメントを読まなくても必要な情報がすぐにわかります。
  2. 一貫性のあるデータ生成:

    • データ生成のロジックが一箇所に集約されるため、どこからでも一貫した方法でプロジェクトを生成できます。
    • 各コントローラで異なる方法でデータを生成することがなくなります。
  3. 保守性の向上:

    • データ生成ロジックを変更する必要がある場合、モデル内のcreateProjectメソッドだけを変更すれば済みます。これにより、コードの保守が容易になります。

標準のcreatesaveを直接使うことの問題点

  1. あいまいさ:

    • 標準のcreatesaveメソッドは柔軟性が高いため、最低限の型が合えばどんなデータでも保存できます。これにより、間違ったデータが保存されるリスクがあります。
  2. 重複と一貫性の欠如:

    • コントローラごとにデータ生成ロジックを書いていると、似たようなコードが複数箇所に存在し、微妙に異なる実装がされることがあります。これにより、コードの重複が発生し、バグの温床となります。

まとめ

モデルにデータ生成・保存のロジックを移すことで、コードの明確性、一貫性、保守性、再利用性が向上します。これにより、誤ったデータ操作を防ぎ、コードの品質を高めることができます。特に複雑なビジネスロジックを含むアプリケーションでは、このアプローチが非常に有効です。

Discussion