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 的服务容器做了以下魔术 (也许像

  1. 正在注入组模型,
  2. 然后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);
    }