Laravel 5.2 使用 uuid 字符串作为 id 的隐式路由模型绑定

Posted

技术标签:

【中文标题】Laravel 5.2 使用 uuid 字符串作为 id 的隐式路由模型绑定【英文标题】:Laravel 5.2 implicit route model binding using uuid string as id 【发布时间】:2016-07-05 10:21:40 【问题描述】:

我正在设置一个新的 laravel 安装,并且在使用 uuid 作为 id 时遇到了隐式路由模型绑定的问题。

我的路线:

Route:group(['prefix' => 'admin'], function()
    Route:resource('users', 'Admin\UserController');
);

Admin\UserController的show方法:

public function show(App\User $user) 
    dd($user);

所以当我点击 URL my.app/admin/users/long-uuid-string-here 时,我希望看到用户信息,但我得到一个空的用户对象。

当我将以下内容添加到 RouteServiceProvider 时,它按预期工作:

$router->model('admin/users', \App\User::class);

有什么我遗漏的吗,隐式模型绑定是否需要一个整数?是因为它在路由组中还是其他什么?

是的!id存在于数据库中,我使用的是laravel 5.2

【问题讨论】:

【参考方案1】:

由于你使用的是资源路由,所以路由会是这样的:

Route::get('admin/users/users', 'Admin\UserController@show');

注意users 变量。是复数。所以在你的 show 方法中:

改变这个:

public function show(App\User $user) 
    dd($user);

public function show(App\User $users) 
    dd($users);

这有点奇怪,但这就是问题所在。

【讨论】:

我使用的是id列中的uuid 你在哪里注册你的$router->model()方法? 在RouteServiceProvider的启动方法中。如果我以这种方式明确声明它就可以工作,我想知道为什么它不能隐式工作。按照你的推理,我想这一定与它在一个前缀组中的事实有关? @BenHarvey:找到问题并发布解决方案。 如果您不喜欢路由名称和参数中的复数表示法,您可以在您的routes.php 中添加Route::singularResourceParameters();,它们将被单数化。

以上是关于Laravel 5.2 使用 uuid 字符串作为 id 的隐式路由模型绑定的主要内容,如果未能解决你的问题,请参考以下文章

如何在Laravel 5.2中将表单数据作为路由参数传递

使用 Laravel 关系 orm 时 UUID 二进制(16)的问题

在 laravel 迁移中使用 UUID 作为默认值

在 Postgresql 中使用 UUID 的 Rails 5.2 活动存储

Laravel 5.2 Eloquent 主键作为多键

雄辩的模型属性作为骆驼案例 [Laravel 5.2] [Dingo API]