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" ...
つまり、 /**
* 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;
}
}
<?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');
}
}
<?php use Illuminate\Support\Facades\Config; class Test { public function index() { Config::get('app.name'); } }
getFacadeAccessor() </code の戻り値に基づいて、コンテナから対応する実際の列オブジェクトを取得します。 >。 </li><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?php
public static function __callStatic($method, $args)
{
$instance = static::getFacadeRoot();
if (! $instance) {
throw new RuntimeException(&#39;A facade root has not been set.&#39;);
}
return $instance->$method(...$args);
}</pre><div class="contentsignin">ログイン後にコピー</div></div><li>APPコンテナ<p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">protected static function getFacadeAccessor()
{
return &#39;config&#39;;
}</pre><div class="contentsignin">ログイン後にコピー</div></div>にconfig列が登録されているため、実際には <code>Config::get('app.name', 'dafault)
がリポジトリ列にアクセスします get( 'app.name', 'default')
メソッド。 関連知識の詳細については、PHP 中国語 Web サイト
をご覧ください。 !以上がLaravelのファサードとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。