2017-09-12 90 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

嗨變身。是崇高的文字有這個功能。但我想學習如何自己解決這個問題。不過謝謝。 –