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