6

我发现理解 Facades 有点困难。特别是如何从外观名称中找到底层类名称/位置。我已经浏览了文档,但仍然不清楚。比如在使用的时候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()返回一个字符串auth。但是auth我应该看哪门课?如何解决实际类?

谢谢,

4

4 回答 4

6

您可以使用getFacadeRoot()

例如

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

或获取完全限定的类名

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

您也可以使用容器通过它的访问器来解析一个类。这就是 Laravel 在解析 Facade 时所做的事情。

$object = resolve('auth'); // Illuminate\Auth\AuthManager instance
于 2017-09-12T10:10:24.907 回答
3

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

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

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

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

于 2017-09-12T10:01:14.510 回答
2

一种选择是利用@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注释,因此很容易找到该类。

于 2017-09-12T10:23:26.527 回答
0

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

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

function cart() {
    return \Gloudemans\Shoppingcart\Facades\Cart::getFacadeRoot();
}
于 2020-04-03T23:05:08.483 回答