コレクションや文字列ヘルパーに存在しないメソッドが欲しいと何度思ったことか?メソッドを連鎖させ始めますが、そのうちの 1 つが不足していることが判明したときに壁にぶつかります。正直に言って、それは理解できます。ご存知のとおり、フレームワークは万能のものです。私もこの状況に何度も遭遇しました。毎回、フレームワークの拡張方法に入る前に、拡張したいものがマクロ可能であるかどうかを確認します。しかし、それは何を意味するのでしょうか?それがまさに私たちが探求するものです!
次の JWT があるとしましょう:
そしてヘッダーを抽出する必要があります:
fromJson() は存在しませんか?確かに、次のようにすることもできます。
しかし、それのどこが楽しいのでしょうか?しかも、それは私の記事です?
したがって、Stringable クラスを拡張する方法が必要です。これを行う方法はいくつかありますが、Laravel は開発者がカスタム メソッドを追加したい可能性があることを事前に考えて、クラスをマクロ可能、つまり私が好んで呼んでいるように拡張可能な
にしました。 >IlluminateSupportStringable クラスを調べると、Macroable トレイトを使用していることがわかります。
クラスを拡張してみましょう。 AppServiceProvider に以下を追加します:
次に、コードを再実行してみましょう:
完璧に動作しますか?しかし今、あなたはこれがどのように機能したのか疑問に思っているかもしれません。 $this->value とは正確には何でしょうか?ハリー・ポッターの中で何が起こっているのですか?
Stringable クラスは、macro() メソッドを提供する Macroable トレイトを使用していることがわかっています。これが何をするのか詳しく見てみましょう:
これは非常に簡単で、コールバックを静的マクロ配列に保存するだけです。ここで、特性をさらに詳しく調べると、存在しないメソッドが呼び出されるたびにトリガーされる __call メソッドが見つかります。私たちの場合、それは fromJson() です。それでは詳しく見てみましょう:
まず、マクロが登録されているかどうかを確認し (fromJson() の場合)、次にマクロ配列からコールバック (またはオブジェクト) をフェッチします。ここで魔法のトリックを説明します。マクロがクロージャの場合 (この例のように)、bindTo() を呼び出します。これは本質的に、最初の引数として渡されるものを $this が参照する必要があることをクロージャに伝えます。この場合、それは $value 属性を持つ Stringable インスタンスです。
これが $this->value を実行できる理由です。
もう一つお見せしたいものがあるんです!同じクラスを数回拡張すると、サービス プロバイダーがすぐに混乱してしまう可能性があります。すべてのカスタム マクロを Mixin と呼ばれるクラスに抽出できます。
StringableMixin を作成しましょう:
これで、AppServiceProvider でこのミックスインを登録できます:
それで終わりです!これで、次のことができるようになります:
基本的には同じですが、少しだけすっきりしています。
これがどのように機能するか知りたい場合は、Macroable トレイトの mixin() メソッドがリフレクション API を使用していることを確認してください。これは、Mixin クラスからすべてのパブリック メソッドを取得し、それぞれがクロージャを返すことを期待し、前に見たのと同じようにクロージャをマクロとして登録します。
これまで見てきたように、多くの魔法が行われており、IDE は定義されたマクロについて知りません。チーム内で作業している場合、他の開発者もこれらのマクロについて知りませんが、これは良くありません。幸いなことに、それを支援するツールがあります。無料のオープンソース オプションは、Laravel IDE ヘルパー パッケージです。
パッケージをインストールして _ide_helper.php ファイルを生成すれば、準備完了です。
私たちの例はかなり単純ですが、Laravel に同梱されている一般的なクラスのほとんどはマクロ可能であるため、マクロをこれよりもさらに拡張することができます。たとえば、新しい apiResponse() マクロ、またはアプリのロジックで非常に一般的で必要以上に繰り返されていると思われるマクロを追加できます。しかし、やりすぎないでください。マクロはさらに複雑さを増し、チームで作業する場合には混乱を招く可能性があります。
それで、フレームワーク自体ではなく、アプリケーションに何かが欠けていると感じたときは、マクロを使用してください?
以上がLaravel の内部 - ちょっとしたマクロの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。