Laravel:模型如何从路由参数中注入
Laravel: how model gets injected from route parameter
我看过以下路线:
Route::prefix('/users/{user}')->group(function () {
Route::get('groups/{group}', 'UserGroupController@show');
}
并且在 UserGroupController:
use App\Group;
public function show(Request $request, User $user, Group $group)
{
dd($group);
}
我的问题是 $group
模型对象是如何从原始路由参数字符串构造的?
我的猜测是 laravel 的服务容器做了以下魔术
(也许像
- 正在注入组模型,
- 然后
Group::where('id', $group)->first()
但不确定。
你猜对了。在检索模型的核心 service provider 中有一个绑定。如果您调用:
,绑定模型是相同的
$temp = new Group
$model = Group::where($temp->getRouteKeyName(), request()->route('group'))->firstOrFail();
更新。实际上刚刚找到 it happens:
/**
* Retrieve the model for a bound value.
*
* @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation $query
* @param mixed $value
* @param string|null $field
* @return \Illuminate\Database\Eloquent\Relations\Relation
*/
public function resolveRouteBindingQuery($query, $value, $field = null)
{
return $query->where($field ?? $this->getRouteKeyName(), $value);
}
我看过以下路线:
Route::prefix('/users/{user}')->group(function () {
Route::get('groups/{group}', 'UserGroupController@show');
}
并且在 UserGroupController:
use App\Group;
public function show(Request $request, User $user, Group $group)
{
dd($group);
}
我的问题是 $group
模型对象是如何从原始路由参数字符串构造的?
我的猜测是 laravel 的服务容器做了以下魔术 (也许像
- 正在注入组模型,
- 然后
Group::where('id', $group)->first()
但不确定。
你猜对了。在检索模型的核心 service provider 中有一个绑定。如果您调用:
,绑定模型是相同的$temp = new Group
$model = Group::where($temp->getRouteKeyName(), request()->route('group'))->firstOrFail();
更新。实际上刚刚找到 it happens:
/**
* Retrieve the model for a bound value.
*
* @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation $query
* @param mixed $value
* @param string|null $field
* @return \Illuminate\Database\Eloquent\Relations\Relation
*/
public function resolveRouteBindingQuery($query, $value, $field = null)
{
return $query->where($field ?? $this->getRouteKeyName(), $value);
}