laravel `Auth:user()` 或 `Auth:id()` 如何工作

ctr*_* f5 9 php laravel laravel-5 laravel-authorization

laravelAuth:user()或如何Auth:id()工作

它驻留在会话或数据库中。

我搜索但没有得到好的文章。

请帮助理解。我知道我会得到很多反对票;)

Rob*_*Rob 7

这是我试图弄清楚Auth::user()通话中实际发生的事情:

Auth::user()

Illuminate\Support\Facades\Auth
extends Illuminate\Support\Facades\Facade

Facade::__callStatic('user')

static::getFacadeRoot()

resolveFacadeInstance(static::getFacadeAccessor == 'auth' (from Auth class))

return static::$app[$name];
static::$app is instance of Illuminate\Foundation\Application
extends Illuminate\Container\Container
Run Code Online (Sandbox Code Playgroud)

哪个实现ArrayAccess(这就是$obj[]语法起作用的原因)

Container::offsetGet(auth)

Application::make(auth) 

Container::getAlias(auth) return 'auth'

Container::make(auth)

Container::resolve(auth)
Run Code Online (Sandbox Code Playgroud)

yadda, yadda, yadda 见 Application::registerCoreContainerAliases

'auth' = Illuminate\Auth\AuthManager

AuthManager::user() = AuthManager::__call = $this->guard()->user()

AuthManager::guard(web)

AuthManager::resolve(web) (see config/auth.php)

AuthManager::createSessionDriver() returns new Illuminate\Auth\SessionGuard

SessionGuard::user() // <---- this is what actually get's called, based on default config
Run Code Online (Sandbox Code Playgroud)

  • 我也有这个问题,这个答案确实很有帮助。我需要弄清楚“Auth::user()”和“Auth::id()”是否从数据库或会话中检索了详细信息。从阅读 `SessionGuard::user()` 和 `SessionGuard::id()` 的源代码可以看出: 1. 如果先前已在当前请求中进行过此调用,则将从内存中重用该值。2. 如果该值当前不在内存中,则从适当的提供程序(通常是数据库)调用该值。3. 对于“Auth::id”,该值专门从会话中提取。请注意,如果您将数据库用于会话,则这是无关紧要的。 (2认同)

小智 3

你读过这篇文章吗?这是一个很好的入门指南

https://laravel.com/docs/5.4/authentication

  • 这并没有真正回答“如何”的问题。当我查看该类(vendor/laravel/framework/src/Illuminate/Support/Facades/Auth.php)时,它有两个方法,这两个方法都不是 user(),并且扩展了一个同样不具有的抽象类(Facade)没有 user() 方法。我也不明白 __callStatic 方法如何在这两个类之外执行任何操作。Auth::user() 到底是如何工作的? (8认同)