61. 路由 路由模型绑定

  • Laravel 为路由模型绑定提供了一个直接自动将模型实例注入到路由中的方法。

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

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

在这个例子中,由于 $user 变量被类型提示为 Eloquent 模型 App\User,变量名称又与 URI 中的 {user} 匹配,因此,Laravel 会自动注入与请求 URI 中传入的 ID 匹配的用户模型实例。如果在数据库中找不到对应的模型实例,将会自动生成 404 异常。

  • 如果你想要模型绑定在检索给定的模型类时使用除 id 之外的数据库字段,你可以在 Eloquent 模型上重写 getRouteKeyName 方法:
/**
 * 为路由模型获取键名。
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

Route::get('/users/{user}', 'UsersController@show')->name('users.show');

...
use App\Models\User;
class UsersController extends Controller
{
    public function create()
    {
        return view('users.create');
    }
    public function show(User $user)
    {
        return view('users.show', compact('user'));
    }
}

在上面代码中,由于 show() 方法传参时声明了类型 —— Eloquent 模型 User,对应的变量名 $user 会匹配路由片段中的 {user},这样,Laravel 会自动注入与请求 URI 中传入的 ID 对应的用户模型实例。

我们将用户对象 $user 通过 compact 方法转化为一个关联数组,并作为第二个参数传递给 view 方法,将数据与视图进行绑定。

在视图模板中就可以使用 {{ $user->name }} 显示数据内容。


  • 要注册显式绑定,使用路由器的 model 方法来为给定参数指定类。在 RouteServiceProvider 类中的 boot 方法内定义这些显式模型绑定:
public function boot()
{
    parent::boot();

    Route::model('user', App\User::class);
}

接着,定义一个包含 {user} 参数的路由:

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

因为我们已经将所有 {user} 参数绑定至 App\User 模型,所以 User 实例将被注入该路由。例如,profile/1 的请求会注入数据库中 ID 为 1 的 User 实例。

  • 如果你想要使用自定义的解析逻辑,就使用 Route::bind 方法。传递到 bind 方法的闭包会接受 URI 中大括号对应的值,并且返回你想要在该路由中注入的类的实例:
public function boot()
{
    parent::boot();

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

你可能感兴趣的:(61. 路由 路由模型绑定)