Laravel コンセプトのシリーズでは、サービス コンテナー、サービス プロバイダー、ファサード等のLaravel フレームワークの中核と知られる技術について学びます。
Laravel の使用経験がある場合は、次のコードに遭遇したことがあるでしょう。
Cache::set(‘access_token’, \Illuminate\Support\Facades\Request::get(‘token’));
ファサードである「Cache::set(), Request::get(), DB::table(), Http::get()」に注目してください。
では、ファサードとは具体的に何なのかを話しましょう。
ファサードは、コンテナー内のクラスに静的プロキシ クラスを提供します。これにより、非静的関数を静的に呼び出すことができます。
それは複雑だと思いませんか? 明確にするために次の例を見てみましょう。
非静的関数を呼び出す標準的な方法は次のとおりです。
$cache = new CacheManager(app());
ここでは、キャッシュは静的に呼び出されます。
Cache::set(‘access_token’, $token);
PHPの基礎知識があれば、「::」キーワードがクラス オブジェクトをインスタンス化せずに静的関数を呼び出すのに役立つことは誰でも知っています。
さて、次はファサードがどのように動くかを見ていきましょう。
次の例を使用してみましょう。
use Illuminate\Support\Facades\URL;
上記はファサードのURLを使用した例です。ご覧のとおり、Illuminate\Support\Facades\URLクラスを通常どおり使用しました。ただし、そのクラスを開くと、単一の関数を備えたクラスしか得られません。
/**
待って、Cacheクラスはファサードクラスを継承しています。そのクラスを開こうとすると、その中にset()関数 が定義されているのではないでしょうか? クラスを開いたら、ああ、何もない?。
ここがファサードの魔法を発揮するところです。
PHPの話に戻ると、クラスに存在しない静的関数が呼び出される場合、代わりに __callStaticという、魔法があるようなメソッドが呼び出されます。次のコードを見てみましょう。
<?php
上記のコードをコピーしてテストを実行してみましょう。get()関数を呼び出すと、「Get関数」の結果が得られることが直ぐに把握できます。
テストクラスにはset()関数はありません。これで、__callStatic()関数が完全な関数名と引数で呼び出されます。結果を確認すると、次のようになります。
__callStatic: set function [].
ファサード クラスを再度開き、__callStatic関数を見つけてみましょう。URL::route()関数を呼び出すと、例外を投げらずに、__callStaticが実行されることを理解できるでしょう。
/**
しかし、URL::route()のroute()関数は実際にはどこにあり、そしてどのように記載されているのでしょうか?
__callStatic を呼び出すときにファサードが実行する手順は次のとおりです。
<?php
AppServiceProviderクラスに、次のコードを追加します。
public function register(): void
<?php
getFacadeAccessor()の戻り値は、コンテナーにバインドされている(「invoice」) 値と一致する必要があることに注意してください。
public function Test()
そのため、初期化または実装するための構成方法を知らずに、Invoice Facadeのsend() 関数を呼び出したことを把握できます。
Route::URL() の例に戻り、次のコード行を削除するとどうなるでしょうか。
use Illuminate\Support\Facades\URL;
答えは、コードがまだ適切に動作するということです。 これは、ファサード エイリアスと呼ばれる仕組みによるものです。
Illuminate\Support\Facades\Facade.phpクラスを再度開き、defaultAliases() 関数を見つけます。この関数はデフォルトのファサードのエイリアスを定義するため、このクラスを使用する必要はありません。
練習例で、エイリアスも使用したい場合はどうすればよいでしょうか? 以下の手順で実施してください。
次のコードをconfigs/app.phpに追加します。
‘aliases’ => Facade::defaultAliases()->merge([
use App\InvoiceFacade;
もう一度試してください。結果も同じです。
これで、Laravelファサードとその魔法の仕組みが理解できました。 次回の投稿では、サービス コンテナ技術について詳細的に説明します。投稿をフォローしていただきありがとうございます。
フィードバックがありましたら、下記のコメント欄でお知らせください!?
最近の投稿