Facade—Laravel學習筆記

summac發表於2019-02-16

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。

相關文章