Laravel

Laravelコントローラー入門|作成方法とデータの受け渡し

コントローラーは、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」の形式で命名するのが慣例です(例:EmployeeControllerProductController)。PascalCaseで記述します。

コントローラーの基本構造

作成されたコントローラーは以下のような構造になっています。クラス内にメソッドを定義し、各メソッドがルーティングから呼び出されます。

app/Http/Controllers/EmployeeController.php
<?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テンプレート)にデータを渡すには、複数の方法があります。

PHP
// 方法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テンプレート内で変数として利用できます。

resources/views/employees/index.blade.php
@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.indexresources/views/employees/index.blade.phpに対応します。

リクエストデータの取得

フォームから送信されたデータやURLパラメータは、Requestオブジェクトを使って取得します。メソッドの引数にRequest $requestを指定すると、Laravelが自動的に注入します。

PHP
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プロパティでマスアサインメントを制御してください。

リダイレクトとフラッシュメッセージ

データの作成・更新・削除後は、別ページにリダイレクトするのが一般的です。その際、一時的なメッセージ(フラッシュメッセージ)を渡すことができます。

PHP
// 名前付きルートへリダイレクト + フラッシュメッセージ
return redirect()->route('employees.index')
    ->with('success', '従業員を登録しました');

// 前のページに戻る + バリデーションエラー
return back()->withErrors(['name' => '名前は必須です'])
    ->withInput();

// URLを指定してリダイレクト
return redirect('/dashboard');
resources/views/layouts/app.blade.php(フラッシュメッセージ表示)
@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()でリダイレクトとフラッシュメッセージを実装する