こんにちは、かつコーチです。
今回は、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 | /posts | index | すべての投稿を表示 |
GET | /posts/create | create | 新しい投稿を作成するフォーム |
POST | /posts | store | 新しい投稿を保存 |
GET | /posts/{id} | show | 特定の投稿を表示 |
GET | /posts/{id}/edit | edit | 特定の投稿を編集するフォーム |
PUT/PATCH | /posts/{id} | update | 特定の投稿を更新 |
DELETE | /posts/{id} | destroy | 特定の投稿を削除 |
RESTfulなコントローラーの特徴
- 一貫したルーティング: RESTfulなルートは一貫性があり、API設計や通常のウェブアプリケーション開発に適しています。これにより、URL構造が統一され、ルートの設計がわかりやすくなります。
- シンプルなコード管理: ルートとメソッドが明確に対応しているため、コントローラー内での処理が整理されやすく、開発者にとってメンテナンスしやすい構造になります。
- Laravelの標準に従う: Laravelのリソースコントローラーを使用することで、フレームワークの標準的な使い方に従うことができ、他の開発者との連携もスムーズになります。
APIリソースコントローラー
APIを開発する場合、--api
オプションを使用して、API専用のリソースコントローラーを生成することができます。これにより、create
やedit
メソッドのようなビュー関連のメソッドが含まれず、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
モデルのインスタンスとして渡されます。
コントローラーのリファクタリング
コントローラーが肥大化すると、ビジネスロジックが混在してしまい、
メンテナンスが難しくなります。その場合、次のリファクタリング技術を利用できます。
- フォームリクエスト: バリデーションロジックをコントローラーから分離し、専用のクラスに移動します。
php artisan make:request StorePostRequest
- サービスクラス: コントローラーからビジネスロジックを切り離し、サービスクラスにロジックを委譲します。
まとめ
Laravelのコントローラーは、リクエストの処理とレスポンスの生成を
効率的に管理するための重要なコンポーネントです。
RESTfulなアプローチや、ミドルウェア、フォームリクエスト、
サービスクラスなどを組み合わせることで、コードの整理と保守性を向上させることができます。