发布时间2019-06-13 09:26:32
12
0
0

隐式绑定

Laravel 会自动解析定义在路由或控制器动作(变量名匹配路由片段)中的 Eloquent 模型类型声明,例如(我们将这个路由定义在 routes/api.php 文件中):

//隐式路由绑定
Route::get('user/{user}',function(User $user){
    return $user->email;
})

//隐式控制器动作绑定:UserController
piblic function destory(User $user)
{
    $user->delete();
    return respoinse()->json(['message'=>'User deleted'],200);
}

显式绑定

要注册显式绑定,可以使用路由器的 model 方法来为给定参数指定绑定类。你需要在 RouteServiceProvider 类的 boot 方法中定义显式模型绑定:

public function boot()
{
    parent::boot();
    Route::model('user_model', App\User::class);
}

路由中调用:

$router->get('profile/{user_model}', function(App\User $user) {
     dd($user);
});

由于我们已经绑定 {user_model} 参数到 App\User 模型,User 实例会被注入到该路由。因此,如果请求 URL 是 http://blog.test/api/profile/1,就会注入一个用户 ID 为 1 的 User 实例。

自定义解析逻辑

如果你想要使用自定义的解析逻辑,可以在 RouteServiceProvider 类的 boot 方法中使用 Route::bind 方法,传递到 bind 方法的闭包会获取到 URI 请求参数中的值,并且返回你想要在该路由中注入的类实例:

public function boot()
{
    parent::boot();

    Route::bind('user', function($value) {
        return App\User::where('name', $value)->first() ?? abort(404);
    });
}

你还可以在 Eloquent 模型中覆盖 resolveRouteBinding 方法,这个方法会获取 URI 片段中的值并返回应该被注入的路由模型类实例:

/**
 * Retrieve the model for a bound value.
 *
 * @param  mixed  $value
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveRouteBinding($value)
{
    return $this->where('name', $value)->first() ?? abort(404);
}