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() </code の戻り値に基づいて、コンテナから対応する実際の列オブジェクトを取得します。 >。 <code>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')
rrreee
rrreeeにconfig列が登録されているため、実際には Config::get('app.name', 'dafault)
がリポジトリ列にアクセスします get( 'app.name', 'default')
メソッド。
以上がLaravelのFacadeの読み込み処理と原理を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。