前回に作成した禁止用語をフィルターするミドルウェアに今度はパラメータを渡してみます。例えば、管理者権限を持つユーザーなら禁止用語を隠さずに見れる。
ミドルウェアの変更はいたって簡単で、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
{
...
メルマガ購読の申し込みはこちらから。
