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

时间:2017-09-12 09:49:02

标签: laravel laravel-facade

我发现外墙有点难以理解。特别是如何从外观名称中查找基础类名称/位置。我已经阅读了文档,但仍然不清楚。例如,使用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();
 }
}

验证外观getFacadeAccessor()方法返回字符串 auth 。但是我应该看哪个auth课程?如何解决实际的课程?

谢谢,

4 个答案:

答案 0 :(得分:2)

在Serviceprovider中的某个位置,auth密钥已注册到某个位置。对于auth中的vendor/laravel/frameworksrc/Illuminate/Auth/AuthServiceProvider.php密钥。您可以在registerAuthenticator()方法中看到auth密钥已注册到具有单例模式的Illuminate\Auth\AuthManager

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

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

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

答案 1 :(得分:2)

您可以使用getFacadeRoot()

例如

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

或获取完全限定的类名

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

此外,您可以使用容器通过它的访问器来解析类。这就是Laravel在解决幕墙时所做的事情。

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

答案 2 :(得分:1)

一种选择是在立面上使用@see注释

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

通常该方法应存在于这些类/接口

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

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

答案 3 :(得分:0)

您可以在包/服务上使用getFacadeRoot()来获取其对象:

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

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