Не работает Laravel Route Model Binding

В Laravel существует Route Model Binding — удобный способ автоматического внедрения экземпляра модели по идентификатору ($id) в маршруты. Например, если пользователь посещает /tasks/1, благодаря cвязыванию модели и маршрута, Laravel автоматически загружает задачу Task с id = 1, а затем внедряет этот экземпляр в контроллер.

Проблема

Допустим имеется маршрут в файле routes.php

Route::group(['prefix' => 'api/v1'], function () {
    Route::apiResource('publications', '<Plugin_Author>\<PLugin_Name>\Api\Publications')
        ->only(['index', 'show']);
});

В контроллере имеется реализация метода show

use <Plugin_Author>\<PLugin_Name>\Models\Publication;
...
public function show($id)
{
    $publication = Publication::findOrFail($id);
    PublicationResource::withoutWrapping();
    return new PublicationResource($publication);
}

Чтобы механизм заработал следует добавить тип модели для параметра.

use <Plugin_Author>\<PLugin_Name>\Models\Publication;
...
public function show(Publication $publication)
{
    PublicationResource::withoutWrapping();
    return new PublicationResource($publication);
}

И вот тут может произойти нежиданное поведение: Laravel вернёт пустой массив [].

Решение

Добавить к маршруту ->middleware('web'), тогда он примет вид:

Route::group(['prefix' => 'api/v1'], function () {
    Route::apiResource('publications', '<Plugin_Author>\<PLugin_Name>\Api\Publications')
        ->middleware('web')
        ->only(['index', 'show']);
});

и Route Model Binding заработает.

Проблемы со встроенными методами OctoberCMS при использовании routes.php

  • BackendAuth::check() возвращает false если пользователь залогинен в админке.
  • BackendAuth::getUser() возвращает null, вместо пользователя.

Решение аналогичное. Если проблемы проявляются при использовании routes.php, то следует добавлять ->middleware('web').