我发现外墙有点难以理解。特别是如何从外观名称中查找基础类名称/位置。我已经阅读了文档,但仍然不清楚。例如,使用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
课程?如何解决实际的课程?
谢谢,
答案 0 :(得分:2)
在Serviceprovider中的某个位置,auth
密钥已注册到某个位置。对于auth
中的vendor/laravel/frameworksrc/Illuminate/Auth/AuthServiceProvider.php
密钥。您可以在registerAuthenticator()
方法中看到auth
密钥已注册到具有单例模式的Illuminate\Auth\AuthManager
。
容器有几种方法可以将键绑定到特定的类。例如,bind
和singleton
等方法。 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();
}