0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails学習者向けのLaravelAdvent Calendar 2024

Day 15

Laravelのミドルウェア:Railsフィルタとの違い

Last updated at Posted at 2024-12-14

はじめに

プログラミング初学者の方に向けて、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_actionafter_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フィルタはコントローラやアクション単位で柔軟に処理を挟むのに適しています。

初学者の方は、どちらのフレームワークでも公式ドキュメントを参照しながら実践的なコードを書いてみてください!

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?