コントローラーは、LaravelのMVCアーキテクチャにおいて「C(Controller)」に該当する部分です。ルーティングから振り分けられたリクエストを受け取り、モデルと連携してデータを処理し、ビュー(テンプレート)にデータを渡す役割を持ちます。この記事では、コントローラーの作成からデータの受け渡しまで、実践的な使い方を解説します。
コントローラーの作成
コントローラーはArtisanコマンドで作成します。プロジェクトのルートディレクトリで以下のコマンドを実行してください。
# 基本的なコントローラーの作成
php artisan make:controller TestController
# サブディレクトリに作成する場合
php artisan make:controller Admin/UserController
# CRUDメソッド付きで作成する場合
php artisan make:controller EmployeeController --resource
コマンドを実行すると、app/Http/Controllers/フォルダにコントローラーファイルが作成されます。--resourceオプションを付けると、index、create、store、show、edit、update、destroyの7つのメソッドが自動生成されます。
コントローラー名は「何を管理するか + Controller」の形式で命名するのが慣例です(例:EmployeeController、ProductController)。PascalCaseで記述します。
コントローラーの基本構造
作成されたコントローラーは以下のような構造になっています。クラス内にメソッドを定義し、各メソッドがルーティングから呼び出されます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Employee;
class EmployeeController extends Controller
{
// 一覧表示
public function index()
{
$employees = Employee::all();
return view('employees.index', compact('employees'));
}
// 詳細表示
public function show($id)
{
$employee = Employee::findOrFail($id);
return view('employees.show', compact('employee'));
}
// 新規作成処理
public function store(Request $request)
{
Employee::create($request->all());
return redirect()->route('employees.index')
->with('success', '登録しました');
}
}
各メソッドは処理を行った後、view()でテンプレートを返すか、redirect()で別ページにリダイレクトします。
ビューへのデータの渡し方
コントローラーからビュー(Bladeテンプレート)にデータを渡すには、複数の方法があります。
// 方法1: 第2引数に連想配列で渡す
return view('employees.index', ['employees' => $employees, 'total' => $total]);
// 方法2: compact関数で変数名から配列を作る(推奨)
return view('employees.index', compact('employees', 'total'));
// 方法3: withメソッドでチェーンする
return view('employees.index')
->with('employees', $employees)
->with('total', $total);
compact()は変数名の文字列から連想配列を作成するPHP組み込み関数です。変数が多い場合にコードが簡潔になるため、Laravelでは最もよく使われる方法です。
ビュー側でのデータ利用
渡されたデータはBladeテンプレート内で変数として利用できます。
@extends('layouts.app')
@section('content')
<h1>従業員一覧({{ $total }}名)</h1>
@forelse($employees as $employee)
<div class="card">
<h3>{{ $employee->name }}</h3>
<p>部署: {{ $employee->department->name }}</p>
<p>電話: {{ $employee->phone }}</p>
</div>
@empty
<p>従業員が登録されていません。</p>
@endforelse
@endsection
テンプレートファイルのパス指定にはドット記法を使います。employees.indexはresources/views/employees/index.blade.phpに対応します。
リクエストデータの取得
フォームから送信されたデータやURLパラメータは、Requestオブジェクトを使って取得します。メソッドの引数にRequest $requestを指定すると、Laravelが自動的に注入します。
public function store(Request $request)
{
// 特定のフィールドを取得
$name = $request->input('name');
// プロパティとしてアクセス
$email = $request->email;
// 全データを取得
$allData = $request->all();
// 指定したフィールドだけ取得(ホワイトリスト方式)
$data = $request->only(['name', 'email', 'phone']);
// 指定したフィールドを除外して取得
$data = $request->except(['_token']);
// デフォルト値を指定
$status = $request->input('status', 'active');
}
$request->all()でそのままcreate()に渡すと、意図しないフィールドが保存される危険があります。必ずonly()で必要なフィールドだけを取得するか、モデルの$fillableプロパティでマスアサインメントを制御してください。
リダイレクトとフラッシュメッセージ
データの作成・更新・削除後は、別ページにリダイレクトするのが一般的です。その際、一時的なメッセージ(フラッシュメッセージ)を渡すことができます。
// 名前付きルートへリダイレクト + フラッシュメッセージ
return redirect()->route('employees.index')
->with('success', '従業員を登録しました');
// 前のページに戻る + バリデーションエラー
return back()->withErrors(['name' => '名前は必須です'])
->withInput();
// URLを指定してリダイレクト
return redirect('/dashboard');
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
まとめ
php artisan make:controllerでコントローラーを作成する- コントローラーはリクエストを受け取り、モデルからデータを取得してビューに渡す
- データの渡し方は
compact()、連想配列、with()の3種類がある RequestオブジェクトでフォームデータやURLパラメータを取得する- セキュリティのため
only()や$fillableでフィールドを制限する redirect()とwith()でリダイレクトとフラッシュメッセージを実装する