Laravel — P51:路由模型隐式绑定

时间:2023-02-12 13:59:24

现在我们已经熟悉了依赖注入,我们还能用这个概念做什么呢?我们能否像模型一样将我们的模型“注入”​​User​​​到我们的路由中,然后在不实例化​​User​​模型的情况下利用模型属性?我们怎么会那样做?在使用与该用户关联的属性之前,我们不需要先“找到”特定用户吗?

信不信由你,Laravel 有一种无需显式执行以下操作即可获取用户详细信息的方法​​User::find(24);​​:

隐式绑定

我们应该明白,我们​​id​​至少需要为我们的模型提供一个,否则,它将如何从数据库表中提取我们特定资源的信息?在这个​​User​​例子中,我们不希望 Laravel 返回一个随机用户,我们想要一个特定的用户。

use App\Models\User;

Route::get('/implicit-binding/{user}', function (User $user) {
return $user;
});

如果我们访问这条路线,你应该得到这样的东西。

{
"id": 2,
"name": "Maria Nitzsche",
"email": "colt21@example.org",
"email_verified_at": "2023-02-07T18:56:39.000000Z",
"created_at": "2023-02-07T18:56:39.000000Z",
"updated_at": "2023-02-07T18:56:39.000000Z"
}

发生了什么?Laravel 隐式绑定​​{user}​​到​​$user​​. 因为我们输入了类型提示​​User $user​​,Laravel 知道我们正在注入一个​​User​​模型,所以它会自动找到我们的​​User​​特定​​id​​.

只要它们匹配,你的论点叫什么并不重要。使用隐式绑定,​​id​​当参数是类型提示时,这将是 Laravel 搜索的字段。

所以,如果你想做这样的事情(命名你的 URL 参数​​id​​),它不会工作:

use App\Models\User;

Route::get('/implicit-binding/{id}', function (User $user) {
return $user;
});

你只会得到​[] 回应。

但是如果我们想使用另一个字段怎么办,比如​​name​​?我们可以这样做,但它需要说明密钥。

更改密钥

如果我们想改为根据他们的​​name​​or查找用户​​email​​,我们必须声明那是我们要查看的列。我们该怎么做?通过在我们的路线中说明关键。

use App\Models\User;

Route::get('/implicit-binding/{user:name}', function (User $user) {
return $user;
});

我们现在可以访问如下路线:

​http://0.0.0.0/implicit-binding/Maria%20Nitzsche​

Laravel 将搜索​​users​​表并返回该资源。

{
"id": 2,
"name": "Maria Nitzsche",
"email": "colt21@example.org",
"email_verified_at": "2023-02-07T18:56:39.000000Z",
"created_at": "2023-02-07T18:56:39.000000Z",
"updated_at": "2023-02-07T18:56:39.000000Z"
}

如果您只想显示电子邮件已验证的用户怎么办?这就是显式绑定的概念,下次再讲。