如何从 Laravel 中的 Facade 名称获取基础 class 名称

How to get underlying class name from Facade name in Laravel

我发现 Facades 有点难以理解。特别是如何从外观名称中找到基础 class name/location。我已经阅读了文档,但仍然不清楚。例如,当使用 Auth::login() ,我发现 Auth 门面中没有 login() 方法。

 class Auth extends Facade
{
/**
 * Get the registered name of the component.
 *
 * @return string
 */
protected static function getFacadeAccessor()
{
    return 'auth';
}

/**
 * Register the typical authentication routes for an application.
 *
 * @return void
 */
 public static function routes()
 {
    static::$app->make('router')->auth();
 }
}

Auth门面getFacadeAccessor()方法returns一个字符串auth。但是我应该看哪个auth class?如何解析实际class?

谢谢,

在服务提供商的某处,auth 密钥已注册到某物。对于 vendor/laravel/frameworksrc/Illuminate/Auth/AuthServiceProvider.php 中的 auth 键。可以看到在registerAuthenticator()方法中,auth键以单例模式注册到Illuminate\Auth\AuthManager

容器有几种方法可以将键绑定到特定 class。例如 bindsingleton 等方法。 Facades 只是一个额外的 class,用于从根命名空间静态调用主 class。

如果要查看使用了哪个class,可以使用以下代码:get_class(resolve('auth'))。当然,您可以将 auth 替换为您要检查的任何字符串。

奖励:我认为您可以通过以某种方式注册您自己的经理来覆盖此行为。我建议您扩展正常的 AuthManager 并覆盖您希望看到更改的方法。

您可以使用getFacadeRoot()

例如

$object = Auth::getFacadeRoot() // Illuminate\Auth\AuthManager instance

或获取完全限定的 class 名称

$class = get_class(Auth::getFacadeRoot()) // 'Illuminate\Auth\AuthManager'

您还可以使用容器通过其访问器解析 class。这就是 Laravel 在解析 Facade 时在幕后所做的事情。

$object = resolve('auth'); // Illuminate\Auth\AuthManager instance

一种选择是在外观上使用 @see 注释

/**
 * @see \Illuminate\Auth\AuthManager
 * @see \Illuminate\Contracts\Auth\Factory
 * @see \Illuminate\Contracts\Auth\Guard
 * @see \Illuminate\Contracts\Auth\StatefulGuard
 */
class Auth extends Facade

通常方法应该存在于这些classes/interfaces

例如,Auth::check() 存在于 \Illuminate\Contracts\Auth\Guard::check()

如果您使用允许您遵循这些定义的编辑器,则遍历起来会更容易一些。通常只有一个 @see 注释,因此很容易找到 class.

您可以在 package/service 上使用 getFacadeRoot() 来获取其对象:

例如,我编写了一个辅助函数来获取 Facade 对象,这样我就可以从任何地方轻松使用该 Cart 对象:

function cart() {
    return \Gloudemans\Shoppingcart\Facades\Cart::getFacadeRoot();
}