Не работает 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 сделать простейшую переадресацию с одной страницы на другую?

Создаём страницу (Page), задаем URL и в секции код добавляем обработчик на хук жизненного цикла страницы. В данном случае это onStart, которая выполняется перед началом загрузки страницы.

function onStart()
{
    return Redirect::to('http://tyapk.ru');
}

Про сохранение полей даты в Eloquent

Если в моделе не указать

protected $dates = ['something_at'];

То надо делать формат

// Поле типа date 
'something_at' => Carbon::now()->addDays(7)->format('Y-m-d'),

// Поле типа date 
'something_at' => Carbon::now()->addDays(7)->format('Y-m-d H:i:s'),

Laravel Where Exists Clauses

Метод whereExists позволяет написать SQL-условия where exists. Метод whereExists принимает в качестве аргумента замыкание, которое получит экземпляр конструктора запросов, позволяя вам определить запрос для помещения в условие "exists":