如何从 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。例如 bind
和 singleton
等方法。 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();
}
我发现 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。例如 bind
和 singleton
等方法。 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();
}