Facade は実際にはコンテナ内のクラスの静的プロキシであり、コンテナに格納されている任意のオブジェクトの任意のメソッドを静的に呼び出すことができます。以下の記事では、Laravel の Facade の読み込みプロセスと原理に関する関連情報を主に紹介します。必要な方は参考にしてください。
公式ドキュメントで与えられた定義
「ファサードは、アプリケーションのサービスコンテナに「静的」インターフェイスを提供します。 Laravel には、ほとんどの機能へのアクセスを提供する多くのファサードが付属しています。 Laravel Facade は、実際にはサービスコンテナ内の基礎となるクラスの「静的プロキシ」であり、従来の静的メソッドと比較して、使用時により柔軟でテストが容易な、より洗練された構文を提供できます。 "
オブジェクトの特定のメソッドにアクセスするために、名前空間の長いリストを使用したり、オブジェクトをインスタンス化したりする必要はありません。
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 の新しいパッケージ自動検出ルールです。このうち、array_merge は、当面、PackageManifest パッケージによって提供されるエイリアスを考慮しません。次の形式の配列:
"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 です。登録が完了すると、後続のすべての使用クラスがロード関数によって完了します。自動ロード。 注: spl_autoload_register を定義する場合、このパラメータが true の場合、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;
}
}
特定の既存のクラス (AppUser) を使用するか、エイリアス (Config) を使用するかに関係なく、自動読み込みは、load 関数を通じて最初に完了します。この関数は false を返し、他の自動ロード関数は自動ロードを完了します (composer psr-4 など)。AliasLoader のロードメソッドでは、class_alias 関数が主にエイリアスの自動ロードを実装するために使用されます。公式の例は次のとおりです:
<?php use Config; use App\User; class Test { public function index() { Config::get('app.name'); new User(); } }
Facade の読み込み
次のような Facade を使用する場合:
public function load($alias) { if (isset($this->aliases[$alias])) { return class_alias($this->aliases[$alias], $alias); } }
実際、ロードされるのは IlluminateSupportFacadesConfig クラスです (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 は IlluminateSupportFacadesFacade クラスから継承しており、__callStatic メソッドがこの基本クラスで定義されているため、Facade を (インスタンス化せずに) 簡単に使用できます。 <?php
use Config;
class Test
{
public function index()
{
Config::get('app.name');
}
}
getFacadeRoot メソッドはエイリアス クラスを取得するために使用されます。すべての Facade クラスが getFacadeAccessor メソッドを定義する必要があることがわかっています。このメソッドの可能な戻り値は次のとおりです:
<?php use Illuminate\Support\Facades\Config; class Test { public function index() { Config::get('app.name'); } }getFacadeRoot メソッドは、
getFacadeAccessor()
の戻り値に基づいて、コンテナから対応する実際の列オブジェクトを取得します。 >。 <?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); }
protected static function getFacadeAccessor() { return 'config'; }にconfig列が登録されているため、実際には
Config::get('app.name', 'dafault)
がリポジトリ列にアクセスします get( 'app.name', 'default')
メソッド。 PHP 中国語 Web サイト
をご覧ください。 !以上がLaravelのファサードとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。