前回に作成した禁止用語をフィルターするミドルウェアに今度はパラメータを渡してみます。例えば、管理者権限を持つユーザーなら禁止用語を隠さずに見れる。

ミドルウェアの変更はいたって簡単で、handle()のメソッドに渡す引数を1つ$role追加します。

namespace App\Http\Middleware;

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

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

    // $roleの引数を追加
    public function handle(Request $request, Closure $next, string $role): mixed
    {
        $all = $request->collect()->map(function ($value, $key) use($role) {
            // 管理権限なら禁止用語は隠さずに
            if ($role === 'admin') {
                return $value;
            } else {
                return is_string($value) ? Str::of($value)->replace(static::$forbiddenWords, '***')->toString() : $value;
            }
        })->all();

        $request->merge($all);

        return $next($request);
    }

$roleadminなら、禁止用語は隠さずに、それ以外は隠すという条件分岐を設けています。

さっそく、tinkerで実行してみましょう。

> $request = app('request');

> $request->merge(['sentence' => '私は「禁止1」と叫んでしまいました。'])->all();
= [
    "sentence" => "私は「禁止1」と叫んでしまいました。",
  ]
 
> use App\Http\Middleware\HideForbiddenWords;

> (new HideForbiddenWords)->handle($request, fn($request) => $request, 'admin')->all();
= [
    "sentence" => "私は「禁止1」と叫んでしまいました。",
  ]

隠さずに表示されましたね。

以下のようにroutes/web.phpにおいて、ミドルウェアを装着するならコロンと合わせて指定します。

use App\Http\Middleware\HideForbiddenWords;
 
Route::patch('/profile', [ProfileController::class, 'update'])
    ->name('profile.update')
    ->middleware(HideForbiddenWords::class.':admin');

複数の権限を指定したいなら、つまり以下のように、admineditorの指定としたいなら、以下のようにコンマで区切って指定します。

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

対応するミドルウェアのコード方は、以下のように引数をstring ...$roles可変引数を使用するように変えて対応します。

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

    // $roleの引数を追加
    public function handle(Request $request, Closure $next, string ...$roles): mixed
    {
...
メルマガ購読の申し込みはこちらから。

By khino