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

### はじめに
プログラミング初学者の方に向けて、LaravelのミドルウェアとRailsのフィルタ（before/afterフィルタ）の違いを解説します。

### Laravelのミドルウェアとは？

Laravelのミドルウェアは、HTTPリクエストのライフサイクル中にリクエストをフィルタリングしたり、特定の処理を実行したりする仕組みです。たとえば、認証、CORS設定、リクエストログの記録などに使用されます。

Laravelのミドルウェアは次のように作成されます：

#### ミドルウェアの作成

```
php artisan make:middleware ExampleMiddleware
```

このコマンドで生成されるファイルは`app/Http/Middleware`ディレクトリに保存されます。

#### ミドルウェアの構造

以下はミドルウェアの基本的な構造です：

```php
<?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`プロパティに登録し、特定のルートで使用します。

```php
protected $routeMiddleware = [
    'example' => \App\Http\Middleware\ExampleMiddleware::class,
];
```

使用する際は、ルート定義にミドルウェアを適用します：

```php
Route::get('/example', [ExampleController::class, 'index'])->middleware('example');
```

### Railsのフィルタとは？

Railsのフィルタは、アクションの前後で処理を実行する仕組みです。特に`before_action`と`after_action`がよく使われます。

#### before_actionの例

```ruby
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の例

```ruby
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での認証

ミドルウェアを利用して認証を実装します。

```php
class AuthenticateMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        if (!$request->user()) {
            return redirect('login');
        }

        return $next($request);
    }
}
```

`routes/web.php`で適用：

```php
Route::group(['middleware' => 'auth'], function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
});
```

#### Railsでの認証

`before_action`を利用して認証を実装します。

```ruby
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フィルタはコントローラやアクション単位で柔軟に処理を挟むのに適しています。

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

### 参考記事
https://readouble.com/laravel/11.x/ja/middleware.html