关于laravel 8.x 文档中 路由 章节中关于 显式绑定 隐式绑定的疑问?

首先在文档中对隐式绑定的示例以及描述我可以理解
代码如下

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

Laravel 会自动处理在路由或控制器方法中,与类型提示的变量名相匹配的路由段名称的的 Eloquent 模型。

我觉得这里对隐式绑定已经说的挺清楚了。只要路由的变量和类型提示变量名匹配就会自动处理。
但是后文对显式绑定的示例似乎没能说明白显式绑定是什么定义,或者说有什么用。

要注册显式绑定,请使用路由器的 model 方法为给定的参数指明参数对应的类。您应该在 RouteServiceProvider 类的 boot 方法的开头定义显式模型绑定

接下来,定义一个包含 {user} 参数的路由
文档中对显式绑定的示例如下

public function boot()
{
    Route::model('user', \App\Models\User::class);
// ...
}    


Route::get('profile/{user}', function (App\Models\User $user)
{

});        

实际上如果不在boot()中定义如上的模型绑定,我访问该地址时依旧能够对模型进行正确解析。
并且这条在显示绑定中做示例的路由的定义似乎也符合隐式绑定的定义。

希望有人能为我解答一下,这两种绑定的具体区别?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

「约定大于配置」这是框架的主要思想之一。默认约定:路由参数需与模型类名一致。

所以很容易理解,显示绑定,针对参数中的字符串与数据表名不一致的情况

3年前 评论

@LiamHao 但是隐式绑定可以采用自定义键名来做到不一致,你的意思是说,用通用的显式绑定来避免在路由中手动指定键名吗?

3年前 评论
LiamHao 3年前

显示绑定其中一个作用就是给用户提供一个自定义的功能。

3年前 评论
godruoyi

举个列子你就明白了。

public function boot()
{
    \Illuminate\Support\Facades\Route::model('user', \App\Models\ClientUser::class);
}

路由:

Route::get('_test/{user}', function ($user) {
    dd($user);
});

这样这里没有制定 $user 属于哪个 model。

测试

file

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!