路由与模型绑定
当向路由或控制器方法注入模型 ID 时,您可能总是会检索该 ID 与模型是否一致。Laravel
路由模型绑定提供了一个方便的方案,它可以自动注入模型实例到路由中。例如,您可以注入与给定 ID 匹配的整个 User
模型实例,而不是注入用户的 ID
隐式绑定
Laravel 会自动处理在路由或控制器方法中,与类型提示的变量名相匹配的路由段名称的的 Eloquent 模型
Route::get('users/{user}', function (App\Models\User $user) {
dd($user);
});
就是说,
由于$user变量是模型中的user,也就是数据库模型,
变量{user}又与模型中的$user对应,
其实,变量{user}是id,是模型id,
laravel会根据传入的id去查询模型中有没有这个数据,
如果没有这个数据,就会返回404
如:如果传递的id在模型中是存在的
如果id在模型中不存在,就会报404
当然,默认是以id作为传递键的,如果想要自定义键名也是可以的
比如这个,是以邮箱为键名,传递的就要邮箱了,会根据邮箱去模型中查找
Route::get('users/{user:email}', function (App\Models\User $user) {
dd($user);
});
上面说到的是在定义路由的时候就定义的,也可以去模型中定义键名
如果希望模型绑定在检索给定的模型类时,默认使用的是 id 以外的数据库字段,则可以重写 Eloquent 模型上的 getRouteKeyName 方法
/**
* 获取该模型的路由的自定义键名
*
* @return string
*/
public function getRouteKeyName()
{
return 'email';//以id为键名
}
例如,一个完整使用模型注入的例子
第一步,在控制器中传入模型,这个会根据路由传递的id值去查找书籍
public function edit(Blog $blog)
{
return view('blog.edit',['blog'=>$blog]);
//传递参数到视图中,视图就可以使用这个变量了
}
第二步,在视图中使用它
因为在控制器中传递了一个变量到视图中,所以,,是可以使用这个变量的
<input type="text" class="form-control"
value="{{$blog->title}}" id="exampleFormControlInput1">