Laravel中Facade是什麼?

黄舟
發布: 2023-03-16 10:52:01
原創
2445 人瀏覽過

Facade其實是一個容器中類別的靜態代理,他可以讓你以靜態的方式來呼叫存放在容器中任何物件的任何方法。以下這篇文章主要為大家介紹了Laravel中Facade的載入過程與原理的相關資料,需要的朋友可以參考下。

Laravel中Facade是什麼?

官方文件給出的定義

#「Facades 為應用的服務容器提供了一個“靜態” 接口。 Laravel 自帶了許多 Facades,可以存取絕大部分功能。 Laravel Facades 實際上是服務容器中底層類別的 “靜態代理” ,相對於傳統靜態方法,在使用時能夠提供更加靈活、更加易於測試、更加優雅的語法。 」

你不必use 一大串的命名空間,也不用實例化對象,就能存取對象的具體方法。

use Config;

class Test
{
 public function index()
 {
 return Config::get('app.name');
 }
}
登入後複製

Facade 的啟動與註冊

Facade 的啟動引導是在Illuminate\Foundation\Bootstrap\RegisterFacades 中註冊的。

public function bootstrap(Application $app)
{
 Facade::clearResolvedInstances();
 Facade::setFacadeApplication($app);

 AliasLoader::getInstance(array_merge(
 $app->make('config')->get('app.aliases', []),
 $app->make(PackageManifest::class)->aliases()
 ))->register();
}
登入後複製

預設的別名設定是從app 設定檔下的aliases 讀取的, PackageManifest 是laravel 5.5 新增的套件自動發現規則,這裡我們暫時不考慮PackageManifest 套件提供的別名。將透過AliasLoader 將所有的facade 註冊進自動載入。

注意:

這裡在定義spl_autoload_register 時,最後面的參數傳的是true。而不是佇列尾部。別名(Config),都會先透過load 函數來完成自動載入,當函數傳回false 時,再由其他自動載入函數來完成自動載入(如composer psr-4)。的load 方法中,主要是用了class_alias 函數來實現的別名自動載入。

當我們在使用Facade 時,如:

 "App" => "Illuminate\Support\Facades\App"
 "Artisan" => "Illuminate\Support\Facades\Artisan"
 "Auth" => "Illuminate\Support\Facades\Auth"
 "Blade" => "Illuminate\Support\Facades\Blade"
 ...
登入後複製
實際上載入的是Illuminate\Support\Facades\Config 類別(因為我們已經註冊了class_alias),相當於:
 /**
 * Prepend the load method to the auto-loader stack.
 *
 * @return void
 */
 protected function register()
 {
 if (! $this->registered) {
  spl_autoload_register([$this, 'load'], true, true);

  $this->registered = true;
 }
 }
登入後複製
而所有的Facade 都繼承自Illuminate\Support\Facades\Facade 類,在該基類中定義了一個__callStatic 方法,已至於我們能夠輕鬆地使用Facade(不用實列化)。
<?php

use Config;
use App\User;

class Test
{
 public function index()
 {
 Config::get(&#39;app.name&#39;);
 new User();
 }
}
登入後複製

getFacadeRoot 方法用來取得別名類別的具體實列,我們知道,所有的 Facade 類別都需要定義一個 getFacadeAccessor 方法。該方法可能的回傳值有:

String 類型的字串(如config, db)

String 類型的類別字串(如config, db)

String 類型的類別字串(如App\Service\SomeService)

Object 具體的實列化物件

Closure 閉包

  • 如Config Facade 的getFacadeAccessor 方法如下:

    public function load($alias)
    {
     if (isset($this->aliases[$alias])) {
     return class_alias($this->aliases[$alias], $alias);
     }
    }
    登入後複製

    getFacadeRoot 方法將根據
  • getFacadeAccessor()
  • 的傳回值,從容器從取出對應的實列物件。

    class foo { }
    
    class_alias(&#39;foo&#39;, &#39;bar&#39;);
    
    $a = new foo;
    $b = new bar;
    
    // the objects are the same
    var_dump($a == $b, $a === $b); //true
    var_dump($a instanceof $b); //false
    
    // the classes are the same
    var_dump($a instanceof foo); //true
    var_dump($a instanceof bar); //true
    
    var_dump($b instanceof foo); //true
    var_dump($b instanceof bar); //true
    登入後複製

    由於APP 容器中已經註冊過config 的實列
  • <?php
    
    use Config;
    
    class Test
    {
     public function index()
     {
     Config::get(&#39;app.name&#39;);
     }
    }
    登入後複製
  • 所以

    \Config::get('app.name', 'dafault)

    實際存取的是Repository 實列的
  • get('app.name', 'default')
  • 方法。

    更多相關知識,請造訪 
  • PHP中文網! !

    以上是Laravel中Facade是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板