コントローラー
はじめに
すべてのリクエスト処理ロジックをルートファイル内のクロージャとして定義する代わりに、"コントローラー" クラスを使用してこの動作を整理することができます。コントローラーは関連するリクエスト処理ロジックを単一のクラスにグループ化できます。たとえば、UserController
クラスは、ユーザーに関連するすべての受信リクエストを処理し、ユーザーの表示、作成、更新、削除などを処理するかもしれません。デフォルトでは、コントローラーは app/Http/Controllers
ディレクトリに保存されます。
コントローラーの記述
基本的なコントローラー
新しいコントローラーを素早く生成するには、make:controller
Artisan コマンドを実行できます。デフォルトでは、アプリケーションのすべてのコントローラーは app/Http/Controllers
ディレクトリに保存されます:
php artisan make:controller UserController
基本的なコントローラーの例を見てみましょう。コントローラーには、受信するHTTPリクエストに応答する任意の数のパブリックメソッドが含まれる可能性があります:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\View\View;
class UserController extends Controller
{
/**
* Show the profile for a given user.
*/
public function show(string $id): View
{
return view('user.profile', [
'user' => User::findOrFail($id)
]);
}
}
コントローラークラスとメソッドを記述したら、次のようにコントローラーメソッドへのルートを定義できます:
use App\Http\Controllers\UserController;
Route::get('/user/{id}', [UserController::class, 'show']);
指定されたルートURIに一致するリクエストがあると、App\Http\Controllers\UserController
クラスの show
メソッドが呼び出され、ルートパラメータがメソッドに渡されます。
コントローラはベースクラスを拡張する必要はありません。ただし、すべてのコントローラで共有されるメソッドを含むベースコントローラクラスを拡張すると便利な場合があります。
シングルアクションコントローラ
コントローラアクションが特に複雑な場合、その単一のアクションに完全なコントローラクラスを割り当てると便利かもしれません。これを実現するために、コントローラ内に単一の __invoke
メソッドを定義できます:
<?php
namespace App\Http\Controllers;
class ProvisionServer extends Controller
{
/**
* Provision a new web server.
*/
public function __invoke()
{
// ...
}
}
シングルアクションコントローラのルートを登録する際は、コントローラメソッドを指定する必要はありません。代わりに、ルーターにコントローラの名前を単純に渡すことができます:
use App\Http\Controllers\ProvisionServer;
Route::post('/server', ProvisionServer::class);
make:controller
Artisanコマンドの --invokable
オプションを使用して、呼び出し可能なコントローラを生成できます:
php artisan make:controller ProvisionServer --invokable
コントローラスタブはスタブの公開を使用してカスタマイズできます。
コントローラミドルウェア
ミドルウェアは、ルートファイル内のコントローラのルートに割り当てることができます:
Route::get('profile', [UserController::class, 'show'])->middleware('auth');
または、コントローラクラス内でミドルウェアを指定すると便利かもしれません。そのためには、コントローラが HasMiddleware
インターフェースを実装する必要があります。このインターフェースは、コントローラに静的な middleware
メソッドを持つべきであることを規定しています。このメソッドから、コントローラのアクションに適用するべきミドルウェアの配列を返すことができます:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;
class UserController extends Controller implements HasMiddleware
{
/**
* Get the middleware that should be assigned to the controller.
*/
public static function middleware(): array
{
return [
'auth',
new Middleware('log', only: ['index']),
new Middleware('subscribed', except: ['store']),
];
}
// ...
}
また、コントローラミドルウェアをクロージャとして定義することもできます。これは、ミドルウェアクラス全体を書かずにインラインミドルウェアを定義する便利な方法を提供します:
use Closure;
use Illuminate\Http\Request;
/**
* Get the middleware that should be assigned to the controller.
*/
public static function middleware(): array
{
return [
function (Request $request, Closure $next) {
return $next($request);
},
];
}