Не работает 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').


Похожие записи

OctoberCMS. Ошибка RelationController: "Не удалось найти шаблон (partial) ... traits\ViewMaker.php"

В контроллере поведения RelationController при нажатии на кнопке "Cоздание" вылетает ошибка с подобным содержаним

"Не удалось найти шаблон (partial) с именем _comments.htm." on line 91
of ...\modules\system\traits\ViewMaker.php

FrontEnd контроллеры в OctoberCMS

В OctoberCMS нет концепции frontEnd контроллеров. Иными словами, идеология этой CMS не подразумевает возможность просто создать некий ProductController с несколькими action для обслуживания маршрутов Route::method('product/{id}', 'ProductController@show'). Вместо этого предлагается использовать компоненты плагинов. Именно компоненты являются формой frontEnd контроллеров.

Laravel. Catch FindOrFail Exception

use Illuminate\Database\Eloquent\ModelNotFoundException;
...
try {
  $publication = Publication::findOrFail($id);
} catch (ModelNotFoundException $ex) {
  // Error handling code
}
22 декабря 2017 г. в Laravel