はじめに
プログラミング初学者の方に向けて、LaravelのミドルウェアとRailsのフィルタ(before/afterフィルタ)の違いを解説します。
Laravelのミドルウェアとは?
Laravelのミドルウェアは、HTTPリクエストのライフサイクル中にリクエストをフィルタリングしたり、特定の処理を実行したりする仕組みです。たとえば、認証、CORS設定、リクエストログの記録などに使用されます。
Laravelのミドルウェアは次のように作成されます:
ミドルウェアの作成
php artisan make:middleware ExampleMiddleware
このコマンドで生成されるファイルはapp/Http/Middleware
ディレクトリに保存されます。
ミドルウェアの構造
以下はミドルウェアの基本的な構造です:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ExampleMiddleware
{
public function handle(Request $request, Closure $next)
{
// リクエスト前の処理
$response = $next($request);
// リクエスト後の処理
return $response;
}
}
$next($request)
は次のミドルウェアまたはコントローラにリクエストを渡します。
リクエスト前後で処理を実行可能です。
ミドルウェアの登録
グローバルミドルウェア:app/Http/Kernel.phpの$middleware
プロパティに登録します。
ルートミドルウェア:$routeMiddleware
プロパティに登録し、特定のルートで使用します。
protected $routeMiddleware = [
'example' => \App\Http\Middleware\ExampleMiddleware::class,
];
使用する際は、ルート定義にミドルウェアを適用します:
Route::get('/example', [ExampleController::class, 'index'])->middleware('example');
Railsのフィルタとは?
Railsのフィルタは、アクションの前後で処理を実行する仕組みです。特にbefore_action
とafter_action
がよく使われます。
before_actionの例
class ArticlesController < ApplicationController
before_action :authenticate_user, only: [:edit, :update]
def edit
# 編集処理
end
def update
# 更新処理
end
private
def authenticate_user
redirect_to login_path unless current_user
end
end
before_action
は特定のアクションの前に実行される処理を定義します。
only
オプションで適用するアクションを指定可能です。
after_actionの例
class ArticlesController < ApplicationController
after_action :log_action, only: [:create]
def create
# 作成処理
end
private
def log_action
Rails.logger.info "Article was created."
end
end
after_action
はアクションの後に処理を実行します。
LaravelミドルウェアとRailsフィルタの違い
1. 適用範囲
Laravelミドルウェア:リクエスト全体を対象とし、複数のコントローラやルートで再利用可能です。
Railsフィルタ:特定のコントローラやアクションに限定される処理を定義します。
2. 実行タイミング
Laravelミドルウェア:リクエストの前後で処理を挟むことができるため、アプリ全体の共通処理に適しています。
Railsフィルタ:コントローラのアクション単位で処理を挟むことができます。
3. 柔軟性と再利用性
Laravelミドルウェア:独立したクラスとして実装されるため、コードの再利用性が高いです。
Railsフィルタ:コントローラに組み込まれるため、適用範囲が狭いです。
実践例:認証処理
Laravelでの認証
ミドルウェアを利用して認証を実装します。
class AuthenticateMiddleware
{
public function handle(Request $request, Closure $next)
{
if (!$request->user()) {
return redirect('login');
}
return $next($request);
}
}
routes/web.php
で適用:
Route::group(['middleware' => 'auth'], function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
});
Railsでの認証
before_action
を利用して認証を実装します。
class ApplicationController < ActionController::Base
before_action :authenticate_user
private
def authenticate_user
redirect_to login_path unless session[:user_id]
end
end
まとめ
LaravelのミドルウェアとRailsのフィルタは、どちらもリクエストやアクションの前後で処理を実行するための仕組みですが、適用範囲や設計思想に違いがあります。
Laravelミドルウェアはアプリ全体の共通処理に適し、再利用性が高い。
Railsフィルタはコントローラやアクション単位で柔軟に処理を挟むのに適しています。
初学者の方は、どちらのフレームワークでも公式ドキュメントを参照しながら実践的なコードを書いてみてください!
参考記事