routes/web.php
use App\Http\Middleware\CheckAge;
Route::get('users/{id}', function($id) {
})->middleware(CheckAge::class);
app/http/Middleware/CheckAge.php
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
echo "[{$request->id}]";
return $next($request);
}
}
app/Http/Kernel.php
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
'CheckAge' => \App\Http\Middleware\CheckAge::class,
];
Вызываем в браузере: http://localhost/users/11
Получаем:
[][11]
Почему?
Ответ из чата https://gitter.im/LaravelRUS/chat
@jhaoda: ты мидлварю не в ту группу добавил
@KarelWintersky: Я правильно понял, что посредники из массива protected $middleware вызываются тупо всегда, посредники из $middlewareGroups['web'] при веб-запросе, а если мы хотим вызвать посредника на конкретном роуте - его в эти массивы передавать не надо в принципе?
@jhaoda: Да. Да. Нет. У всех групп есть докблоки, прочитай их
@KarelWintersky: "нет", в смысле "не надо передавать" или "неправильно понял" ?
@jhaoda: неправильно понял. Вернее, если передавать как класс, то правильно. А если передавать алиас, то неправильно. С алиасом есть возможность указывать параметры для мидлвари
И действительно, если перенести строчку
в
protected $middlewareGroups
, то посредник вызывается только один раз.Попробуем передать в роут посредника не через объявление класса, а по имени (алиасу):
Работает это только в том случае, если посредник объявлен в блоке: