Как правильно вызывать Middleware в Laravel

Всем доброго дня!

Столкнулся со следующей проблемой при реализации middleware. Написал middleware для обработки запроса. В итоге он вызывается после конструктора контроллера, потом после него еще раз вызывается конструктор контроллера. Хотя middleware должен вызваться до контроллера

Код ниже

Создал middleware:

class MyMiddleware
{

    public function handle(Request $request, Closure $next) {
        Log::log("debug", "Вызов middleware");
        return $next($request);
    }

}

Определил его в App\Http\Kernel.php

protected $middlewareGroups = [
         //...
        'api' => [
        //...
        \App\Http\Middleware\MyMiddleware::class,
    ],
];

Далее в файле routes\api.php определил маршруты

Route::post('test', '\App\Http\Controllers\TestController@test');

Создал котроллер

class TestController extends Controller {
    public function __construct()
    {
        Log::log("debug","Конструктор контроллера вызван");
    }
    
    public function test(Request $request) {
        //какой-то код который выполняется...
    }

}

В результате всего этого, в лог падают сообщения в следующем порядке:

1. Конструктор контроллера вызван
2. Вызов middleware
3. Конструктор контроллера вызван

Где я допустил ошибку? Почему конструктор контроллера на группе маршрутов вызывается дважды до выполнения middleware и после, а если повесить middleware на все маршруты, то он вызов котроллера произойдет один раз после выполнения middleware.


Ответы (1 шт):

Автор решения: vhar
  1. метод log фасада Log принимает на вход 2 аттрибута - уровень логированя и сообщение. Ваш код не будет писать в лог ничего кроме исключения Too few arguments to function Illuminate\Log\LogManager::log()
  2. public test(Rquest $request) - сразу две ошибки. Пропущено слово function и Rquest вместо Request

Middleware

class MyMiddleware
{

    public function handle(Request $request, Closure $next) {
        Log::log("info", "Вызов middleware");
        return $next($request);
    }
}

Контроллер

class TestController extends Controller
{
    public function __construct()
    {
        Log::log("info", "Конструктор контроллера вызван");
    }

    public function test(Request $request) {
        Log::log("info", "Метод контроллера вызван");
    }
}

Результат

[2024-07-17 08:23:19] local.INFO: Конструктор контроллера вызван  
[2024-07-17 08:23:19] local.INFO: Вызов middleware  
[2024-07-17 08:23:19] local.INFO: Метод контроллера вызван  

→ Ссылка