【问题标题】:Laravel Route model binding - empty userLaravel Route 模型绑定 - 空用户
【发布时间】:2018-01-10 22:02:26
【问题描述】:

我有路线

http://192.168.10.15/user/33/edit

我正在尝试根据 url id 返回用户。

  public function edit($id, \App\User $user)
    {
        dd($user->id);
         return view('user.update');

    }

id 返回 null,我该怎么做?

【问题讨论】:

  • 对于任何登陆这里的人,请注意变量名区分大小写...

标签: laravel-5 binding ioc-container


【解决方案1】:

要使路由绑定起作用,您应该使类型提示的变量名称与路由段名称相匹配,因为文档需要:

Laravel 自动解析路由中定义的 Eloquent 模型或 类型提示变量名称与路由匹配的控制器操作 段名。例如:

Route::get('api/users/{user}', function (App\User $user) {
return $user->email; });

由于 $user 变量被类型提示为 App\User Eloquent 模型 并且变量名匹配 {user} URI 段,Laravel 将 自动注入 ID 匹配的模型实例 请求 URI 中的相应值。如果匹配的模型实例 在数据库中未找到,将自动生成 404 HTTP 响应。

对于您的情况:

Route::get('/users/{user}/edit', 'YourController@edit');

在你的控制器中:

public function edit(\App\User $user)
{
     dd($user->id);
     return view('user.update')->withUser($user);

}

【讨论】:

  • 如果您的模型在控制器内部的导入中有别名,例如use Models/VeryLongModelNameDoe as Doe,您应该在路由模型绑定中使用Route::get('/{doe}, 'DoeController@edit'),否则您将得到一个空模型。
【解决方案2】:

如果您最近升级到 laravel 5.3 及更高版本,您可能需要检查您是否已更新 laravel/app/Http/Kernel.php 以注册路由中间件以进行绑定替换。

路由模型绑定现在使用中间件完成。全部 应用程序应添加 照亮\路由\中间件\替代绑定到您的网络 app/Http/Kernel.php 文件中的中间件组:

\Illuminate\Routing\Middleware\SubstituteBindings::class,

您还应该注册一个路由中间件以进行绑定替换 在 HTTP 内核的 $routeMiddleware 属性中:

'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,

一旦这个路由中间件被注册,你应该把它添加到 api中间件组:

'api' => [
    'throttle:60,1',
    'bindings',
],

【讨论】:

  • 可以在模型src/Illuminate/Database/Eloquent/Model.php::resolveRouteBinding中调试
  • 我的问题是我忘记在我的自定义路由器中添加api middleware
【解决方案3】:

我通过添加命名路由来修复它。如果没有为路由指定名称,则模型绑定不起作用。

Route::get('product/{product}', "ProductController@read")->name('product.read');

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 2015-07-12
    • 2016-10-25
    • 2022-01-23
    • 1970-01-01
    • 2018-03-03
    • 2019-06-06
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多