Laravel中的Facade提供了對於類的更簡便的訪問方法。在通過Facade訪問類時,是不需要手動對類進行例項化的,對於類的所有可訪問的方法(不管是是靜態還是非靜態方法),都可以採用訪問靜態方法的方式進行訪問,即SomeObjectFacade::someMethod($parameters)
其實某個類的facade可以看作是具體的相關的類的例項的一個代理,而這個例項是在服務容器中註冊的。
現在有一個類AppLearningTestBar:
<?php
namespace AppLearningTest;
class Bar
{
public function test ()
{
echo `Mes from Bar::test`;
return `Mes from Bar::test`;
}
}
以下是這個類的facade的實現:
<?php
namespace AppFacades;
use IlluminateSupportFacadesFacade;
class Bar extends Facade
{
protected static function getFacadeAccessor()
{
return `bar`;
}
}
在通過AppFacadesBar訪問相應的類時,實際上是通過getFacadeAccessor返回的字串`bar`去容器中查詢該字串繫結的所註冊的類的例項。即
<?php
namespace AppProviders;
use IlluminateSupportServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
$this->app->bind(`bar`, function () {
return new AppLearningTestBar();
});
$this->app->alias(`bar`, `AppLearningTestBar`);
}
}
可見,字串`bar`通過中間的容器將facade與具體的類的例項聯絡了起來。
最好,通過在config/app.php中將AppFacadesBar註冊到aliases陣列中,即
`Bar` => AppFacadesBar::class
就可以在Laravel應用中通過該別名而不需要特別引入就可以訪問AppLearningTestBar例項的相關方法了,比如在某個類中呼叫test方法:Bar::test()
,但不需要明顯的引入AppLearningTestBar。