ファサードとは
公式ドキュメントには次のように記載されています:
ファサードは、アプリケーションのサービスコンテナでアクセスできるクラスの静的インターフェースを提供します。 Laravel には多くのファサードが付属しており、知らず知らずのうちにそれらを使用している可能性もあります。 Laravel の「ファサード」は、IoC コンテナ内の基本クラスの静的プロキシとして機能します。提供される構文には、従来の静的メソッドよりも高いテスト容易性と柔軟性を維持しながら、シンプルさと表現の容易さという利点があります。
正直に言うと、この文章は人間の言葉のようには読めません。分解してみます。
まず、Facadesはクラスですが、どのようなクラスですか?これは基本クラスの静的プロキシです。
次に、Facades は、laravel5 に対応して、IOC コンテナーから直接取得できます。つまり、アプリコンテナーにすでに存在しています。
最後に、なぜ ファサード が必要なのでしょうか? 1 つ目の利点は、提供される構文がより簡潔で表現しやすいことです。実際にはこれが主な理由ではなく、主な理由は次のとおりです: テストを容易にし、カップリング (プロキシ モードの利点) を減らすためです
PS: コンテンツのこの部分はインターネットから参照されています。 : 元のアドレス
us $app は、laravel の特別なグローバル変数であり、最初に起動されたときの ioc コンテナのオブジェクト インスタンスであることはご存知でしょう。
したがって、ioc コンテナからインスタンスを取得したい場合は、次のように記述します:
$value = $app->make('cache')->get('key');
$app は PHP の ArrayAccess インターフェイスを実装しているため、次のように簡略化して書くことができます:
$value = $app['cache']->get('key');
関数を使用することもできます 次のように記述しますこれ:
$value = app('cache')->get('key');
この時、Facace が飛び出してきて、こんな風に書けると言いました:
$value = Cache::get('key');動作機構解析
use Illuminate\Support\Facades\Cache;
Facades 次のように記述するだけで済みます:
use Cache;
なぜこのようになれるのでしょうか?実行プロセスの一部を観察したところ、分析は次のとおりです:
この図の重要なポイントは、AliasLoader に登録された自動読み込みメソッドです。これは、app.php 設定にあるエイリアス配列を使用し、それによってこのエイリアスを渡します。 、対応する実際のクラスが存在するファイルを見つけて、オブジェクトのインスタンス化を完了します。
最初に構築する必要があるのは、その機能を実装するために Cache クラス自体です。ここでの対応するファイルは次のとおりです:
IlluminateCacheCacheManager (注: Cache の実装は複数あるため、マネージャーを通じて目的の Cache 実装を取得できます。)
Cache クラスを作成した後、それをサービス内で Go にバインドする必要があります。ここでのサービス プロバイダーの場所は次のとおりです:
IlluminateCacheCacheServiceProvider コードのバインディング部分は次のとおりです:
public function register() { $this->app->singleton('cache', function ($app) { return new CacheManager($app); }); ...... }
ここで注意する必要があるのは、バインド時に文字列「cache」が使用される理由です。これについては後で説明します。 。サービス プロバイダーを作成した後、app.php のプロバイダー配列でサービス プロバイダーを構成する必要があります。ここでのコードは次のとおりです。ファサード
場所は IlluminateSupportFacadesCache にあります。
'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Foundation\Providers\ArtisanServiceProvider::class, Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, Illuminate\Bus\BusServiceProvider::class, Illuminate\Cache\CacheServiceProvider::class, ...... ]すべての Facades クラスは Facades を継承し、getFacadeAccessor メソッドを実装する必要があります。その仕事は、コンテナから何を解析するかを定義することです。これは、バインド時にキャッシュを書き込む場合、ここでキャッシュを返す必要があり、そうでないと解析中にキャッシュが見つからないことを意味します。別の名前に変更してみてください。
最後のステップは、app.php でエイリアス配列を設定することです。これには、Facades の自動読み込みが含まれます。それが最初に描いた絵です。 りー