现在我们已经熟悉了依赖注入,我们还能用这个概念做什么呢?我们能否像模型一样将我们的模型“注入”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"
}
如果您只想显示电子邮件已验证的用户怎么办?这就是显式绑定的概念,下次再讲。
【文章原创作者:阿里云代理商 http://www.558idc.com/aliyun.html 网络转载请说明出处】