前回に作成した禁止用語をフィルターするミドルウェアに今度はパラメータを渡してみます。例えば、管理者権限を持つユーザーなら禁止用語を隠さずに見れる。
ミドルウェアの変更はいたって簡単で、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); }
$role
がadminなら、禁止用語は隠さずに、それ以外は隠すという条件分岐を設けています。
さっそく、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');
複数の権限を指定したいなら、つまり以下のように、adminとeditorの指定としたいなら、以下のようにコンマで区切って指定します。
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 { ...メルマガ購読の申し込みはこちらから。