【Laravel基礎学習5】Laravelのコントローラーについて解説

laravelアイキャッチ Laravel

こんにちは、かつコーチです。

今回は、LaravelのMVCモデルの一部であるコントローラーについて解説します。

Laravelのコントローラーは、リクエストを処理し、

レスポンスを返す役割を持つMVC(モデル・ビュー・コントローラー)アーキテクチャの一部です。

コントローラーは、主にビジネスロジックの処理や、

モデルとビューの間でデータのやり取りを担当します。

Laravelコントローラーの基本

コントローラーの作成

Laravelでコントローラーを作成する際は、artisanコマンドを使用します。

php artisan make:controller ExampleController

これにより、app/Http/ControllersディレクトリにExampleController.phpファイルが生成されます。

デフォルトでは、コントローラーは以下のような構造になります。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ExampleController extends Controller
{
    // コントローラーのアクション(メソッド)をここに追加します
}

コントローラーの役割

  • リクエストの処理: HTTPリクエストを受け取り、その内容を解析して必要な処理を行います。
  • ビジネスロジックの実行: データのバリデーション、データベース操作(モデルとの連携)、外部APIとのやり取りなど、ビジネスロジックを実行します。
  • レスポンスの返却: 処理が完了したら、ビューをレンダリングしてHTMLを返したり、JSON形式でAPIレスポンスを返したりします。

基本的なコントローラーメソッド

コントローラーには、ルートから呼び出される「アクション」が定義されます。以下は典型的なメソッドです。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ExampleController extends Controller
{
    // インデックスページを表示する
    public function index()
    {
        // ロジック処理
        return view('example.index'); // ビューを返す
    }

    // 特定のリソースを取得する
    public function show($id)
    {
        $data = Model::find($id);
        return view('example.show', compact('data')); // ビューにデータを渡す
    }

    // リソースを新規作成するフォームを表示する
    public function create()
    {
        return view('example.create');
    }

    // 新しいリソースを保存する
    public function store(Request $request)
    {
        // リクエストデータのバリデーション
        $validated = $request->validate([
            'name' => 'required',
            'description' => 'required',
        ]);

        // データベースに保存
        Model::create($validated);

        // リダイレクト
        return redirect()->route('example.index');
    }

    // リソースを編集するフォームを表示する
    public function edit($id)
    {
        $data = Model::find($id);
        return view('example.edit', compact('data'));
    }

    // 既存のリソースを更新する
    public function update(Request $request, $id)
    {
        $validated = $request->validate([
            'name' => 'required',
            'description' => 'required',
        ]);

        $data = Model::find($id);
        $data->update($validated);

        return redirect()->route('example.index');
    }

    // リソースを削除する
    public function destroy($id)
    {
        $data = Model::find($id);
        $data->delete();

        return redirect()->route('example.index');
    }
}

リソースコントローラー

Laravelは、RESTfulなリソースコントローラーを簡単に定義するために、

php artisan make:controller --resourceコマンドを提供しています。

リソースコントローラーを作成すると、RESTfulなメソッドが自動的に生成され、

ルーティングもシンプルになります。

php artisan make:controller PostController --resource

上記コマンドで作成されたコントローラーには、以下のメソッドが含まれます。

  • index(): リソースの一覧を表示
  • create(): 新しいリソースを作成するフォームを表示
  • store(): 新しいリソースを保存
  • show($id): 特定のリソースを表示
  • edit($id): リソースを編集するフォームを表示
  • update(Request $request, $id): 既存のリソースを更新
  • destroy($id): リソースを削除

リソースコントローラーのルーティング

web.phpに以下のようにルートを設定すると、自動的に適切なメソッドにルートがマッピングされます。

Route::resource('posts', PostController::class);

これにより、次のようなRESTfulなルートが作成されます。

HTTPメソッドURIアクション説明
GET/postsindexすべての投稿を表示
GET/posts/createcreate新しい投稿を作成するフォーム
POST/postsstore新しい投稿を保存
GET/posts/{id}show特定の投稿を表示
GET/posts/{id}/editedit特定の投稿を編集するフォーム
PUT/PATCH/posts/{id}update特定の投稿を更新
DELETE/posts/{id}destroy特定の投稿を削除

RESTfulなコントローラーの特徴

  1. 一貫したルーティング: RESTfulなルートは一貫性があり、API設計や通常のウェブアプリケーション開発に適しています。これにより、URL構造が統一され、ルートの設計がわかりやすくなります。
  2. シンプルなコード管理: ルートとメソッドが明確に対応しているため、コントローラー内での処理が整理されやすく、開発者にとってメンテナンスしやすい構造になります。
  3. Laravelの標準に従う: Laravelのリソースコントローラーを使用することで、フレームワークの標準的な使い方に従うことができ、他の開発者との連携もスムーズになります。

APIリソースコントローラー

APIを開発する場合、--apiオプションを使用して、API専用のリソースコントローラーを生成することができます。これにより、createeditメソッドのようなビュー関連のメソッドが含まれず、APIに特化したコントローラーが生成されます。

php artisan make:controller ApiPostController --api

このコントローラーは、次のようにルーティングします。

Route::apiResource('posts', ApiPostController::class);

コントローラーの機能拡張

ミドルウェア

コントローラーにミドルウェアを設定することで、認証や権限のチェック、

アクセス制限などのロジックを組み込むことができます。

ミドルウェアはコントローラーの特定のメソッドや全体に適用できます。

class PostController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('can:edit-posts')->only('edit', 'update');
    }
}

リソースモデルのバインディング

ルートパラメータとEloquentモデルを自動的に関連付けることができます。

これにより、findOrFailのような記述が不要になります。

// ルーティング
Route::resource('posts', PostController::class);

// コントローラー
public function show(Post $post)
{
    return view('posts.show', compact('post'));
}

ここで、$postは自動的にPostモデルのインスタンスとして渡されます。


コントローラーのリファクタリング

コントローラーが肥大化すると、ビジネスロジックが混在してしまい、

メンテナンスが難しくなります。その場合、次のリファクタリング技術を利用できます。

  1. フォームリクエスト: バリデーションロジックをコントローラーから分離し、専用のクラスに移動します。
php artisan make:request StorePostRequest
  1. サービスクラス: コントローラーからビジネスロジックを切り離し、サービスクラスにロジックを委譲します。

まとめ

Laravelのコントローラーは、リクエストの処理とレスポンスの生成を

効率的に管理するための重要なコンポーネントです。

RESTfulなアプローチや、ミドルウェア、フォームリクエスト、

サービスクラスなどを組み合わせることで、コードの整理と保守性を向上させることができます。

タイトルとURLをコピーしました