如何理解那个{user:id} 与后面的 User $user 为什么可以联系起来

我想问下这laravel底层是怎么处理将
{user:id} 与后面的 Use $user 联系起来的,如何理解这种写法
为什么把所有用户都返回出来了,并且打印出sql 是 select * from laravel_users 没有带上where id= 那个id

use App\Models\User;
Route::get('/getuser/{user:id}', function(User $user){
    return $user->select('username')->get();
});
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

翻源码呗,自己试着追一追代码,很受益的。百闻不如一见
截取 Laravel 源码:

    // Step 1:注册路由时会调用此方法:Illuminate\Routing\RouteUri
    public static function parse($uri)
    {
        ...
            $segments = explode(':', trim($match, '{}?'));
            // 关键在这里,将冒号左边的字符串「user」暂存为键名,右边字符串「id」为键值
            $bindingFields[$segments[0]] = $segments[1];
        ...
    }

    // Step 2:匹配到请求的路由后,会调用此方法:Illuminate\Routing\ImplicitRouteBinding
    public static function resolveForRoute($container, $route)
    {
        ...
        // $instance 是根据字符串「user」反射出来的 User 模型,但还没加入你指定的 id 参数。
        $instance = $container->make(Reflector::getParameterClassName($parameter));
        ...
            // 根据路由参数 id 的值查找对应的实例
            } elseif (! $model = $instance->resolveRouteBinding($parameterValue, $route->bindingFieldFor($parameterName))) {
        ...
    }

    //  Step 2-1:上面提到的 bindingFieldFor 方法:Illuminate\Routing\Route
    public function bindingFieldFor($parameter)
    {
        // $parameter 传入的是字符串「user」
        $fields = is_int($parameter) ? array_values($this->bindingFields) : $this->bindingFields;
        // 这里返回的就是字符串「id」
        return $fields[$parameter] ?? null;
    }

    //  Step 2-2:上面提到的 resolveRouteBinding 方法:Illuminate\Database\Eloquent\Model
    public function resolveRouteBinding($value, $field = null)
    {
        // $field = "id",$value = {数字}
        return $this->where($field ?? $this->getRouteKeyName(), $value)->first();
    }
3年前 评论
donggan (楼主) 3年前
ㅤㅤ 3年前
讨论数量: 3

翻源码呗,自己试着追一追代码,很受益的。百闻不如一见
截取 Laravel 源码:

    // Step 1:注册路由时会调用此方法:Illuminate\Routing\RouteUri
    public static function parse($uri)
    {
        ...
            $segments = explode(':', trim($match, '{}?'));
            // 关键在这里,将冒号左边的字符串「user」暂存为键名,右边字符串「id」为键值
            $bindingFields[$segments[0]] = $segments[1];
        ...
    }

    // Step 2:匹配到请求的路由后,会调用此方法:Illuminate\Routing\ImplicitRouteBinding
    public static function resolveForRoute($container, $route)
    {
        ...
        // $instance 是根据字符串「user」反射出来的 User 模型,但还没加入你指定的 id 参数。
        $instance = $container->make(Reflector::getParameterClassName($parameter));
        ...
            // 根据路由参数 id 的值查找对应的实例
            } elseif (! $model = $instance->resolveRouteBinding($parameterValue, $route->bindingFieldFor($parameterName))) {
        ...
    }

    //  Step 2-1:上面提到的 bindingFieldFor 方法:Illuminate\Routing\Route
    public function bindingFieldFor($parameter)
    {
        // $parameter 传入的是字符串「user」
        $fields = is_int($parameter) ? array_values($this->bindingFields) : $this->bindingFields;
        // 这里返回的就是字符串「id」
        return $fields[$parameter] ?? null;
    }

    //  Step 2-2:上面提到的 resolveRouteBinding 方法:Illuminate\Database\Eloquent\Model
    public function resolveRouteBinding($value, $field = null)
    {
        // $field = "id",$value = {数字}
        return $this->where($field ?? $this->getRouteKeyName(), $value)->first();
    }
3年前 评论
donggan (楼主) 3年前
ㅤㅤ 3年前
http://www.xxx.com/getuser/1

Route::get('/getuser/{user}', function(User $user){
    // 这就是 id 为1的 user 了
    dd($user);
});
3年前 评论

@ 回复已修改,掰开揉碎给你放这了,满意?

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!