Facade---Laravel學習筆記

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

相關文章
相關標籤/搜索