Laravelでは、カスタムに作成したミドルウェアをいろいろな場所で装着することができとてもフレキシブルです。前回ではグローバルやルートで装着しました。今回はLaravel 11.xバージョンから追加されたコントローラでのmiddlewareメソッドで装着してみます。

カスタムに作成したミドルウェア

前回から結構時間が経過しているので、まずそこで作成したミドルウェアのコードを持ち出します。

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Str;
use Illuminate\Http\Request;

class HideForbiddenWords
{
    public static $forbiddenWords = ['禁止1', '禁止2', '禁止3'];

    public function handle(Request $request, Closure $next): mixed
    {
        // 禁止用語を***に変換
        $all = $request->collect()->map(function ($value, $key) {
            return is_string($value) ? Str::of($value)->replace(static::$forbiddenWords, '***')->toString() : $value;
        })->all();

    // もとのリクエストを置き換える
        $request->merge($all); 

        return $next($request);
    }
}

このミドルウェアは、$forbiddenWords配列で設定した3つの禁止用語が入力にあれば、***に変換します。

グローバルでの装着

こちらも前回からのコピーですが、今回のようなローカルなミドルウェアには向いていないです。

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->append(
            \App\Http\Middleware\HideForbiddenWords::class,
        );
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

ルートで装着

以下のようにルートの定義で装着するのが現実的です。特定のコントローラの特定のルートに装着できます。

use App\Http\Middleware\HideForbiddenWords;

Route::patch('/profile', [ProfileController::class, 'update'])
    ->name('profile.update')
    ->middleware(HideForbiddenWords::class);

コントローラで装着

こちら、Laravelの11.xバージョン以降では、以下のようにmiddlewareのメソッド内でも指定できます。


namespace App\Http\Controllers;

use App\Http\Requests\ProfileUpdateRequest;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Illuminate\View\View;

class ProfileController extends Controller implements HasMiddleware
{
    /**
     * Display the user's profile form.
     */
    public function edit(Request $request): View
    {
        return view('profile.edit', [
            'user' => $request->user(),
        ]);
    }

    /**
     * Update the user's profile information.
     */
    public function update(ProfileUpdateRequest $request): RedirectResponse
    {
        $request->user()->fill($request->validated());

        if ($request->user()->isDirty('email')) {
            $request->user()->email_verified_at = null;
        }

        $request->user()->save();

        return Redirect::route('profile.edit')->with('status', 'profile-updated');
    }
...

注意点として、

  • use Illuminate\Routing\Controllers\HasMiddleware;の宣言が必要なこと。
  • middlewareのメソッドは、staticであること。ゆえにその中では、$this->nameのようなインスタンス変数への使用は不可です。

を忘れずに。

ちなみに、Laravel 10.xバージョン以前では、HasMiddlewareはまだ登場していないので、以下のようにコンストラクターでコールしていました。

...
class ProfileController extends Controller
{
    public static function middleware(): array
    {
        return [\App\Http\Middleware\HideForbiddenWords::class];
    }
...
メルマガ購読の申し込みはこちらから。

By khino