Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Two middleware calls

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]

Почему?

@KarelWintersky

This comment has been minimized.

Copy link
Owner Author

commented Oct 2, 2017

Ответ из чата https://gitter.im/LaravelRUS/chat

@jhaoda: ты мидлварю не в ту группу добавил
@KarelWintersky: Я правильно понял, что посредники из массива protected $middleware вызываются тупо всегда, посредники из $middlewareGroups['web'] при веб-запросе, а если мы хотим вызвать посредника на конкретном роуте - его в эти массивы передавать не надо в принципе?
@jhaoda: Да. Да. Нет. У всех групп есть докблоки, прочитай их
@KarelWintersky: "нет", в смысле "не надо передавать" или "неправильно понял" ?
@jhaoda: неправильно понял. Вернее, если передавать как класс, то правильно. А если передавать алиас, то неправильно. С алиасом есть возможность указывать параметры для мидлвари

И действительно, если перенести строчку

'CheckAge'  =>  \App\Http\Middleware\CheckAge::class,

в protected $middlewareGroups , то посредник вызывается только один раз.

Попробуем передать в роут посредника не через объявление класса, а по имени (алиасу):

Route::get('users/{id}', function($id) {
})->middleware('CheckAge');

Работает это только в том случае, если посредник объявлен в блоке:

protected $routeMiddleware = [ 
...
'CheckAge'  =>  \App\Http\Middleware\CheckAge::class,
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.