LaravelでのFacadeの読み込みプロセスと原理の紹介

巴扎黑
リリース: 2023-03-16 11:46:01
オリジナル
1516 人が閲覧しました

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(&#39;app.name&#39;);
 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(&#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
ログイン後にコピー

Facadeの読み込み

Facadeを使用している場合、次のようになります:


<?php

use Config;

class Test
{
 public function index()
 {
 Config::get(&#39;app.name&#39;);
 }
}
ログイン後にコピー

実際に搭載されているのは、 IlluminateSupportFacadesConfig クラス (class_alias を登録しているため)、これは次と同等です:


<?php

use Illuminate\Support\Facades\Config;

class Test
{
 public function index()
 {
  Config::get(&#39;app.name&#39;);
 }
}
ログイン後にコピー

そして、すべての Facade は IlluminateSupportFacadesFacade クラスから継承し、__callStatic メソッドがこの基本クラスで定義されており、Facade を (インスタンス化せずに) 簡単に使用できます。 )。


<?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);
}
ログイン後にコピー

getFacadeRoot メソッドは、エイリアス クラスの特定のインスタンス列を取得するために使用されます。すべての Facade クラスが getFacadeAccessor メソッドを定義する必要があることがわかっています。このメソッドの可能な戻り値は次のとおりです:

  • String 型の文字列 (config、db など)

  • String 型の文字列型 (AppServiceSomeService など)

  • オブジェクト固有の実体化オブジェクト

  • Closure クロージャ

たとえば、Config Facade の getFacadeAccessor メソッドは次のとおりです:


protected static function getFacadeAccessor()
{
 return &#39;config&#39;;
}
ログイン後にコピー

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(&#39;config&#39;, $config = new Repository($items));
ログイン後にコピー

所以 Config::get('app.name', 'dafault) 实际访问的是 Repository 实列的 get('app.name', 'default')

🎜🎜rrreee🎜設定インスタンスがAPPコンテナに登録されているため🎜🎜🎜🎜rrreee🎜、実際には Config::get('app.name', 'dafault) がリポジトリにアクセスします。実際の列の get('app.name', 'default') メソッド。 🎜

以上がLaravelでのFacadeの読み込みプロセスと原理の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート