Неявная привязка модели маршрута 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,.
Пользователь действительно существует. Я начал этот поход с контроллером ресурсов и совершенно другой моделью. То, что вы видите выше, моя попытка предоставить минимальный воспроизводимый пример. Он говорит мне, что в Laravel есть что-то, что настроено неправильно.
просто звучит так, как будто SubstituteBindings не работает.






Он должен работать без проблем в 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 Может быть, вам стоит проверить, какой запрос действительно выполняется? Вы можете попробовать с моим пакетом github.com/mnabialek/laravel-sql-logger или github.com/barryvdh/laravel-debugbar, чтобы узнать, действительно ли выполняется запрос и как он выглядит. Вы на 100% уверены, что используете ту же базу данных, в которой проверяете данные?
Я не думаю, что запрос выполнен. Промежуточное ПО должно быть каким-то образом замкнуто. Я совершенно потерялся. Я снова обновил свой пост, чтобы показать, что запись легко загружается.
@Sonny На самом деле сложно сказать что-то еще с той информацией, которую вы предоставили. Как я уже сказал, вам следует попробовать использовать средство ведения журнала db, чтобы узнать, загружен ли запрос. Может быть, в запрос добавлено что-то еще, может быть, у вас есть какие-то пользовательские привязки, очень сложно сказать больше, не видя всего кода приложения.
Я наконец решил эту проблему. Маршруты в 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'));
}
Есть ли какие-либо настройки модели? псевдонимы столбцов, поведение и т. д.