Laravel中的Facade提供了对于类的更简便的访问方法。在经过Facade访问类时,是不须要手动对类进行实例化的,对于类的全部可访问的方法(无论是是静态仍是非静态方法),均可以采用访问静态方法的方式进行访问,即SomeObjectFacade::someMethod($parameters)
php
其实某个类的facade能够看做是具体的相关的类的实例的一个代理,而这个实例是在服务容器中注册的。数组
如今有一个类App\LearningTest\Bar:app
<?php namespace App\LearningTest; class Bar { public function test () { echo 'Mes from Bar::test'; return 'Mes from Bar::test'; } }
如下是这个类的facade的实现:ide
<?php namespace App\Facades; use Illuminate\Support\Facades\Facade; class Bar extends Facade { protected static function getFacadeAccessor() { return 'bar'; } }
在经过App\Facades\Bar访问相应的类时,其实是经过getFacadeAccessor返回的字符串'bar'去容器中查询该字符串绑定的所注册的类的实例。即this
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; 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 \App\LearningTest\Bar(); }); $this->app->alias('bar', 'App\LearningTest\Bar'); } }
可见,字符串'bar'经过中间的容器将facade与具体的类的实例联系了起来。spa
最好,经过在config/app.php中将App\Facades\Bar注册到aliases数组中,即代理
'Bar' => App\Facades\Bar::class
就能够在Laravel应用中经过该别名而不须要特别引入就能够访问App\LearningTest\Bar实例的相关方法了,好比在某个类中调用test方法:Bar::test()
,但不须要明显的引入App\LearningTest\Bar。code