📜  laravel 路由模型绑定 - PHP (1)

📅  最后修改于: 2023-12-03 15:02:38.492000             🧑  作者: Mango

Laravel 路由模型绑定

概述

路由模型绑定是 Laravel 框架中提供的一种便捷的功能,它可以将路由中需要的模型数据自动注入到控制器方法中。这是一个非常有用的功能,它使得我们可以避免手动去查询模型数据的麻烦,从而提高开发效率。

基本用法

在 Laravel 中,要使用路由模型绑定功能,首先需要在路由定义中指定要绑定的模型类和路由参数。比如下面的示例:

Route::get('/users/{user}', function (App\Models\User $user) {
    return view('users.show', compact('user'));
});

在这个示例中,我们定义了一个路由 /users/{user},它包含一个名为 user 的路由参数。这个参数可以匹配任何字符串,但是我们希望它可以自动转换为 User 模型类的实例,以便我们可以在控制器方法中直接使用它。

为了实现这一点,我们在路由的闭包函数中声明了一个变量 $user,同时将它的类型指定为 App\Models\User,这样 Laravel 就知道我们希望将路由参数自动注入为 User 模型类的实例。最后,我们将 $user 变量传递给视图,以便在视图中显示用户信息。

自定义绑定键名

默认情况下,路由参数的名称与模型类的主键名称是一致的。也就是说,如果 User 模型的主键名称是 id,那么我们必须使用 {id} 作为路由参数的名称才能让 Laravel 对其进行自动绑定。

但是,在实际开发中,我们有时会希望使用其它的绑定键名,比如使用用户名称作为路由参数(即 /users/{name})。这时,我们可以在模型类中定义 getRouteKeyName() 方法,来指定使用哪个字段作为绑定键名。

class User extends Model
{
    public function getRouteKeyName()
    {
        return 'name';
    }
}

在这个示例中,我们重写了 getRouteKeyName() 方法,并返回了模型类中的 name 字段作为绑定键名。这样,我们就可以在路由定义中使用 {name} 作为路由参数名了。

自定义查找逻辑

默认情况下,Laravel 使用模型类的 find() 方法来获取绑定的模型数据。这个方法会根据模型类的主键字段来查找数据,比如使用 $user = User::find($id) 来查找 User 模型的数据。

但是,在实际开发中,我们有时会希望使用其它的查找逻辑,比如使用 slug 字段来查找数据。这时,我们可以在模型类中定义 resolveRouteBinding() 方法,来自定义模型数据的获取逻辑。

class User extends Model
{
    public function resolveRouteBinding($value, $field = null)
    {
        return $this->where('slug', $value)->firstOrFail();
    }
}

在这个示例中,我们重写了 resolveRouteBinding() 方法,并在其中使用 where() 方法来查询 slug 字段匹配指定值的第一个模型数据。如果查询失败,就抛出 ModelNotFoundException 异常,让 Laravel 返回 404 错误页面。

缺省值

当路由参数对应的模型数据不存在时,Laravel 会自动抛出 ModelNotFoundException 异常。但是,在一些情况下,我们希望指定一个缺省值来避免这种异常的抛出。

比如,在用户详情页中,如果指定的用户不存在,我们希望显示一个“用户不存在”的提示消息,而不是直接抛出异常。这时,我们可以使用 Route::fallback() 方法来定义一个缺省路由,让程序在路由参数不存在时返回指定的视图或控制器方法。

Route::get('/users/{user}', function (App\Models\User $user) {
    return view('users.show', compact('user'));
})->fallback(function () {
    return view('404');
});

在这个示例中,我们使用 fallback() 方法为 /users/{user} 路由定义了一个缺省路由,它会在 /users/{user} 的路由参数不存在时返回 404 页面。这样,我们就可以避免在程序中处理 ModelNotFoundException 异常了。

总结

路由模型绑定是 Laravel 中非常有用的一个功能,它可以轻松地将路由参数自动注入为模型类的实例,从而避免了手动查询数据的麻烦,提高了开发效率。在使用路由模型绑定时,我们可以通过自定义绑定键名、查找逻辑和缺省值来定制化功能,使得它更加适合我们的实际需求。