Facade は実際にはコンテナ内のクラスの静的プロキシであり、コンテナに格納されている任意のオブジェクトのメソッドを静的に呼び出すことができます。次の記事では主に Laravel での Facade の読み込みプロセスと原理について説明します。関連情報を参照できます。
前書き
この記事では主に、Laravel の Facade 読み込みプロセスと原則に関する関連コンテンツを紹介し、参考と学習のために共有します。以下では多くを述べませんが、見てみましょう。詳しい紹介。
はじめに
ファサード (発音: /fəˈsäd/) は、アプリケーションのサービス コンテナーで使用できるクラスの「静的」インターフェイスを提供します。特定のメソッドにアクセスするために、多数の名前空間を使用したり、オブジェクトをインスタンス化したりする必要はありません。
use Config; class Test { public function index() { return Config::get('app.name'); } }
ファサードの起動と登録
ファサードの起動ブートはIlluminateFoundationBootstrapRegisterFacadesに登録されます。
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(); }
デフォルトのエイリアス設定は、アプリ設定ファイルのエイリアスから読み込まれます。 PackageManifest は、laravel 5.5 の新しいパッケージ自動検出ルールです。ここでは、当面、PackageManifest パッケージによって提供されるエイリアスを考慮しません。 。
その中で、array_merge は次の形式で配列を返します:
"App" => "Illuminate\Support\Facades\App" "Artisan" => "Illuminate\Support\Facades\Artisan" "Auth" => "Illuminate\Support\Facades\Auth" "Blade" => "Illuminate\Support\Facades\Blade" ...
上記のコードは、AliasLoader を介した自動ロード用にすべてのファサードを登録します。コアは php の spl_autoload_register です。
/** * 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; } }
登録が完了すると、以降のすべての使用クラスは、load 関数を通じて自動的にロードされます。
注: ここで spl_autoload_register を定義する場合、最後のパラメータには true が渡されます。このパラメータが true の場合、 spl_autoload_register() は関数をキューの末尾ではなく先頭に追加します。 (自動ロードはこの関数によって最初に完了します)
つまり、
<?php use Config; use App\User; class Test { public function index() { Config::get('app.name'); new User(); } }
特定の既存のクラス(AppUser)やエイリアス(Config)を使用しても、最初に完了するのは、 load 関数 自動ロード。この関数が false を返すと、他の自動ロード関数 (composer psr-4 など) が自動ロードを完了します。
AliasLoaderのloadメソッドでは、主にclass_alias関数を使ってエイリアスの自動ロードを実装しています。
public function load($alias) { if (isset($this->aliases[$alias])) { return class_alias($this->aliases[$alias], $alias); } }
class_aliasについては、公式の例を次に示します:
class foo { } class_alias('foo', 'bar'); $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
Facadeの読み込み
Facadeを使用している場合、次のようになります:
<?php use Config; class Test { public function index() { Config::get('app.name'); } }
実際に搭載されているのは、 IlluminateSupportFacadesConfig クラス (class_alias を登録しているため)、これは次と同等です:
<?php use Illuminate\Support\Facades\Config; class Test { public function index() { Config::get('app.name'); } }
そして、すべての Facade は IlluminateSupportFacadesFacade クラスから継承し、__callStatic メソッドがこの基本クラスで定義されており、Facade を (インスタンス化せずに) 簡単に使用できます。 )。
<?php public static function __callStatic($method, $args) { $instance = static::getFacadeRoot(); if (! $instance) { throw new RuntimeException('A facade root has not been set.'); } return $instance->$method(...$args); }
getFacadeRoot メソッドは、エイリアス クラスの特定のインスタンス列を取得するために使用されます。すべての Facade クラスが getFacadeAccessor メソッドを定義する必要があることがわかっています。このメソッドの可能な戻り値は次のとおりです:
String 型の文字列 (config、db など)
String 型の文字列型 (AppServiceSomeService など)
オブジェクト固有の実体化オブジェクト
Closure クロージャ
たとえば、Config Facade の getFacadeAccessor メソッドは次のとおりです:
protected static function getFacadeAccessor() { return 'config'; }
getFacadeRoot メソッドは、getFacadeAccessor() の戻り値に基づいて、コンテナから対応する実際の列オブジェクトを取得します。
。 getFacadeAccessor()
的返回值,从容器从取出对应的实列对象。
public static function getFacadeRoot() { $name = static::getFacadeAccessor(); if (is_object($name)) { return $name; } if (isset(static::$resolvedInstance[$name])) { return static::$resolvedInstance[$name]; } return static::$resolvedInstance[$name] = static::$app[$name]; }
由于 APP 容器中已经注册过 config 的实列
<?php //Illuminate\Foundation\Bootstrap/LoadConfiguration $app->instance('config', $config = new Repository($items));
所以 Config::get('app.name', 'dafault)
实际访问的是 Repository 实列的 get('app.name', 'default')
Config::get('app.name', 'dafault)
がリポジトリにアクセスします。実際の列の get('app.name', 'default')
メソッド。 🎜以上がLaravelでのFacadeの読み込みプロセスと原理の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。