2017-09-12 89 views
1

我发现它有点难于理解Facades。特别是如何从外观名称中找到基础类名/位置。我已经通过了文档,但仍不清楚。例如,当使用Auth::login() 时,我发现在Auth正面没有login()方法。如何从Laravel的Facade名称中获取底层类名

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?如何解决实际的课堂?

感谢,

+1

这可能是有用的https://laravel.com/docs/5.5/facades#how-facades-work如果您向下滚动一下,您将看到哪个门面对应于哪个类 – Christophvh

回答

1

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

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

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

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

+0

嗨马克。应用程序如何知道要解析'app'就必须去'Illuminate/Auth/AuthServiceProvider.php'类? –

+0

您在'config/app.php'文件中注册了AuthServiceProvider。如果你在那里注册,它会在启动时执行'boot'和'register'方法。 –

1

您可以使用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 
1

一种选择是利用在门面

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

@see注释一般,该方法应在这些类/接口

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

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

+0

嗨变身。是崇高的文字有这个功能。但我想学习如何自己解决这个问题。不过谢谢。 –