LaravelのFacadeの読み込み処理と原理を詳しく解説

*文
リリース: 2023-03-19 08:48:01
オリジナル
1275 人が閲覧しました

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

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

APPコンテナ

rrreeeにconfig列が登録されているため、実際には Config::get('app.name', 'dafault) がリポジトリ列にアクセスします get( 'app.name', 'default') メソッド。

関連する推奨事項:

Authを変更することによるLaravelのソルトとパスワード認証の使用の詳細な説明

Laravelのローカリゼーションモジュールの詳細な説明

リソースルーティングを書き換える方法の説明Laravel で 🎜🎜🎜

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

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