Неявная привязка модели маршрута

Неявная привязка модели маршрута Laravel не работает. Он не ищет запись, указанную идентификатором. Я получаю новый объект модели.

Учитывая этот код:

Route::get('users/{user}', function (App\User $user, $id) {
    $user2 = $user->find($id);
    return [
        [get_class($user), $user->exists, $user],
        [get_class($user2), $user2->exists],
    ];
});

И этот URL: /users/1

Я получаю такой вывод:

[["App\\User",false,[]],["App\\User",true]]

Я использую PHP 7.2 и Laravel 5.6.


Дополнительная информация

Я успешно выполнил неявную привязку модели маршрута в других проектах Laravel. Я работаю над существующей кодовой базой. Насколько я могу судить, ранее эта функция не использовалась.

Запись пользователя существует. Это не было мягким удалением. В модели не используется признак SoftDeletes.

Я пробовал это, используя различные уникальные имена маршрутов и другие модели.

Я проверил класс App\Http\Kernel на предмет обычных виновников. $middlewareGroups содержит \Illuminate\Routing\Middleware\SubstituteBindings::class, в разделе web, а $routeMiddleware содержит 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,.

Есть ли какие-либо настройки модели? псевдонимы столбцов, поведение и т. д.

waterloomatt 02.08.2018 20:49

Пользователь действительно существует. Я начал этот поход с контроллером ресурсов и совершенно другой моделью. То, что вы видите выше, моя попытка предоставить минимальный воспроизводимый пример. Он говорит мне, что в Laravel есть что-то, что настроено неправильно.

Sonny 02.08.2018 20:55

просто звучит так, как будто SubstituteBindings не работает.

lagbox 03.08.2018 01:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
1 157
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Он должен работать без проблем в Laravel. Я только что проверил это в своем приложении Laravel 5.6, и с этим нет никаких проблем.

Возможные сценарии, почему вы получаете это:

  • пользователь мягко удален
  • этот маршрут не находится внутри файла web.php или api.php - обе группы установили bindings (или \Illuminate\Routing\Middleware\SubstituteBindings::class) внутри свойства $midddlewareGroups в файле app/Http/Kernel.php
  • вы удалили упомянутые привязки из одной из этих групп
  • вы установили некоторую настраиваемую привязку. Например, если вы где-то определили такой код: Route::bind('user', function($user) { return new \App\User(); });

    тогда вы получите результат, который вы показали, потому что вы используете настраиваемую логику и просто возвращаете пустую модель пользователя.

Если вы считаете, что все вышеперечисленное неверно, я бы начал со свежего приложения Laravel 5.6, чтобы попытаться воспроизвести проблему.

Я обновил свой вопрос, чтобы ответить на ваши вопросы, но, возможно, я что-то упустил.

Sonny 02.08.2018 21:29

@Sonny Может быть, вам стоит проверить, какой запрос действительно выполняется? Вы можете попробовать с моим пакетом github.com/mnabialek/laravel-sql-logger или github.com/barryvdh/laravel-debugbar, чтобы узнать, действительно ли выполняется запрос и как он выглядит. Вы на 100% уверены, что используете ту же базу данных, в которой проверяете данные?

Marcin Nabiałek 02.08.2018 21:32

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

Sonny 02.08.2018 21:59

@Sonny На самом деле сложно сказать что-то еще с той информацией, которую вы предоставили. Как я уже сказал, вам следует попробовать использовать средство ведения журнала db, чтобы узнать, загружен ли запрос. Может быть, в запрос добавлено что-то еще, может быть, у вас есть какие-то пользовательские привязки, очень сложно сказать больше, не видя всего кода приложения.

Marcin Nabiałek 02.08.2018 22:04
Ответ принят как подходящий

Я наконец решил эту проблему. Маршруты в routes/web.php не имеют промежуточного программного обеспечения web. Обычно это делается в app/Providers/RouteServiceProvider.php в функции mapWebRoutes(). В какой-то момент во время обновления Laravel определение маршрута было искажено. Выглядело это так:

        Route::group([
            'namespace' => $this->namespace,
        ], function ($router) {
            require base_path('routes/web.php');
        });

Его можно было обновить, используя этот старый стиль определения, чтобы он выглядел так:

        Route::group([
            'middleware' => 'web',
            'namespace' => $this->namespace,
        ], function ($router) {
            require base_path('routes/web.php');
        });

Вместо этого я просто скопировал последний стиль цепочки методов из проекта laravel/laravel, так что теперь он выглядит так:

    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }

Другие вопросы по теме