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

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

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
还望不吝赐教。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

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);
        });
    });
}
4年前 评论
MuYan (楼主) 4年前
讨论数量: 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);
        });
    });
}
4年前 评论
MuYan (楼主) 4年前
lochpure

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

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

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);
        });
    });
}
4年前 评论
MuYan (楼主) 4年前

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