请问下 $request->user (); 是什么用法?

在路由文件中看到了这段代码,看了user()的源码也没看明白,特来求教。

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
还望不吝赐教。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

Request类里面的user方法调用了getUserResolver()方法,getUserResolver()方法返回了成员变量$userResolver,这个类提供一个setUserResolver方法设置$userResolver,但是整个类里面并没有调用到这个方法,而且这个方法是public,显然是给外部调用的

// vendor/laravel/framework/src/Illuminate/Http/Request.php
public function user($guard = null)
{
    return call_user_func($this->getUserResolver(), $guard);
}

public function getUserResolver()
    {
    return $this->userResolver ?: function () {
        //
    };
}

public function setUserResolver(Closure $callback)
{
    $this->userResolver = $callback;

    return $this;
}

可以通过dd(app('request'))观察到框架运行之后,Request$userResolver是有值的,映射到了/vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php文件的83至85行

#userResolver: Closure($guard = null) {#456
    class: "Illuminate\Auth\AuthServiceProvider"
    this: AuthServiceProvider {#52 …}
    use: {
      $app: Application {#2 …}
    }
    file: "/vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php"
    line: "83 to 85"
  }

可以看到是registerRequestRebindHandler方法,这里就对Request设置了$userResolver,然后将设置好的Request重新注册到服务容器,这个方法里面调用了服务容器Auth服务的userResolver()方法,最终就相当于$request->user()调用了Auth->userResolver()

protected function registerRequestRebindHandler()
{
    $this->app->rebinding('request', function ($app, $request) {
        $request->setUserResolver(function ($guard = null) use ($app) {
            return call_user_func($app['auth']->userResolver(), $guard);
        });
    });
}
5年前 评论
MuYan (楼主) 5年前
讨论数量: 3

Request类里面的user方法调用了getUserResolver()方法,getUserResolver()方法返回了成员变量$userResolver,这个类提供一个setUserResolver方法设置$userResolver,但是整个类里面并没有调用到这个方法,而且这个方法是public,显然是给外部调用的

// vendor/laravel/framework/src/Illuminate/Http/Request.php
public function user($guard = null)
{
    return call_user_func($this->getUserResolver(), $guard);
}

public function getUserResolver()
    {
    return $this->userResolver ?: function () {
        //
    };
}

public function setUserResolver(Closure $callback)
{
    $this->userResolver = $callback;

    return $this;
}

可以通过dd(app('request'))观察到框架运行之后,Request$userResolver是有值的,映射到了/vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php文件的83至85行

#userResolver: Closure($guard = null) {#456
    class: "Illuminate\Auth\AuthServiceProvider"
    this: AuthServiceProvider {#52 …}
    use: {
      $app: Application {#2 …}
    }
    file: "/vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php"
    line: "83 to 85"
  }

可以看到是registerRequestRebindHandler方法,这里就对Request设置了$userResolver,然后将设置好的Request重新注册到服务容器,这个方法里面调用了服务容器Auth服务的userResolver()方法,最终就相当于$request->user()调用了Auth->userResolver()

protected function registerRequestRebindHandler()
{
    $this->app->rebinding('request', function ($app, $request) {
        $request->setUserResolver(function ($guard = null) use ($app) {
            return call_user_func($app['auth']->userResolver(), $guard);
        });
    });
}
5年前 评论
MuYan (楼主) 5年前
lochpure

return $request->user();返回登录用户信息。

5年前 评论
MuYan (楼主) 5年前
largezhou 5年前

Request类里面的user方法调用了getUserResolver()方法,getUserResolver()方法返回了成员变量$userResolver,这个类提供一个setUserResolver方法设置$userResolver,但是整个类里面并没有调用到这个方法,而且这个方法是public,显然是给外部调用的

// vendor/laravel/framework/src/Illuminate/Http/Request.php
public function user($guard = null)
{
    return call_user_func($this->getUserResolver(), $guard);
}

public function getUserResolver()
    {
    return $this->userResolver ?: function () {
        //
    };
}

public function setUserResolver(Closure $callback)
{
    $this->userResolver = $callback;

    return $this;
}

可以通过dd(app('request'))观察到框架运行之后,Request$userResolver是有值的,映射到了/vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php文件的83至85行

#userResolver: Closure($guard = null) {#456
    class: "Illuminate\Auth\AuthServiceProvider"
    this: AuthServiceProvider {#52 …}
    use: {
      $app: Application {#2 …}
    }
    file: "/vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php"
    line: "83 to 85"
  }

可以看到是registerRequestRebindHandler方法,这里就对Request设置了$userResolver,然后将设置好的Request重新注册到服务容器,这个方法里面调用了服务容器Auth服务的userResolver()方法,最终就相当于$request->user()调用了Auth->userResolver()

protected function registerRequestRebindHandler()
{
    $this->app->rebinding('request', function ($app, $request) {
        $request->setUserResolver(function ($guard = null) use ($app) {
            return call_user_func($app['auth']->userResolver(), $guard);
        });
    });
}
5年前 评论
MuYan (楼主) 5年前

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