カスタムモジュールでイベントをディスパッチするタイミング


14

これは、Magento 1とMagento 2の両方に関する質問です。

私は、良いプラクティスとして、それを理解してサードパーティのモジュールの開発者は、他のモジュールで動作するようにそれを容易にするために彼らのカスタムモジュールでの発送のイベントに奨励されています。

私が知りたいのですが:

  • 開発者はカスタムモジュールのどこでイベントをディスパッチする必要がありますか?
  • イベントをディスパッチするための推奨スポットはありますか?例えば、コントローラー、モデル、ブロック、ヘルパー、オブザーバー?
  • イベントのディスパッチはパフォーマンスにどのように影響しますか?

はい!良い質問。誰でもこの質問に答えてください。サードパーティの拡張機能開発者やカスタムプロジェクトにとって非常に役立ちます。
-mapaladiya

回答:


10

ここで、明確で明確な答えを見つけることはできません。概して、あなたとあなたのユーザーがそれらを必要とする場所で、モジュール内のイベントをディスパッチする必要があります。必要な場所を考えることができない場合、それらをディスパッチする必要はありません。Magento自体は、非常に多くの異なる場所(コントローラーのプリ/ポストディスパッチ、任意のcrud操作など)で非常に多くのイベントを発行するため、モジュールは何もせずに多くの有用なイベントを既にディスパッチします。

それは満足のいくものではないので、ユーザーがアイテムを追加、削除、変更、または元のアクションとは独立した別のアクションを実行するアクションをモジュールが実行したときに、モジュールからイベントをディスパッチする必要があります。例えば- Magentoのは、持っているvisitor_initイベント自動生成されたイベントのその標準スイートの一部ではありません。このイベントにより、プログラマーはMagentoがデータを記録する前に訪問者オブジェクトを変更できます。これらは、元のモジュール開発者が決定論的に知る方法ではありませんでしたこれは、イベントを追加する必要がある場所でした。おそらく、機能要求やシステムユーザーとのインタビューから発生したものです。ユーザーが何を望んでいるかを理解し、管理者を介してUI / UXを構築することが不可能/実用的でない場合、イベントフックを追加して、別のプログラマーがそれを行えるようにします。

あまりセクシー、追加イベントも(ユーザー、あるいはいずれかの開発を可能にするために安価な方法することができ、あなたのすべての人の恐れが触れることのコードの危ないビットにいくつかの機能を追加するためにチームを)。あなたのPLOP dispatchEvent、コードの途中で電話をそこにフック、そしてあなたは、元のスコープ内のコードを乱すことなく、あなたの機能を追加することができます。[編集者:また、ある時点でそのひどいコードをリファクタリングする必要があります]

パフォーマンスに関しては、ディスパッチにイベントを追加する場所は追加する場所によって異なります。dispatchイベントを呼び出すとき、Magentoは追加のPHP呼び出しをいくつか行い、構成済みのオブザーバーの構成を照会してから、オブザーバーを呼び出す必要があります。一度行うと、これは標準のMagentoディスパッチの範囲で安価に追加されます。ただし、繰り返し実行されると(たとえば、すべてのブロックがレンダリングされる前に)、これが追加される可能性があります。ここには良い経験則はありません-常に正しい答えはプロファイルです。

最後に、Magento 2のw / r / tは、言うには時期尚早です。上記はすべて適用されますが、プラグインシステムはいくつかのしわを追加します。プラグインは、ある観点から見ると、Magentoのパブリックメソッド呼び出しの動作のようなイベントを作成する方法です。理論的には、クラスを正しく設計していれば、イベントは必要ありません。ただし、実際には、別の方法が長いリファクタリングプロセスである場合、Magento開発者にとっては、イベントを保護されたメソッドコードまたはプライベートメソッドコードにドロップすることは魅力的なソリューションになります。また、特定の名前のイベントを作成すると、多くの場合、モジュールを使用する開発者にとって使いやすいエクスペリエンスが作成されます。

お役に立てば幸いです!


9

Magento 1の場合、イベントをスローする適切なタイミングは、すべてのCRUD操作の前後およびレンダリングの前後です。これらの多くはコアの抽象クラスによって既に提供されているため、実際には多くのサードパーティのイベントは必要ありません。

Magento 2では状況が異なります。パブリックメソッドの呼び出しはプラグインでインターセプトできるため、カスタムイベントは不要になりました。
クラスを設計するときは、すべてのメソッドを単純にインターセプトできるようにするのではなく、大きなクラスを複数の小さなクラスに分解することをお勧めします。
その場合、小さなクラスにはそれぞれ、1つまたは2つの適切に名前が付けられ、インターセプト可能なパブリックメソッドがあります。


0

Vinaiが言ったように、CRUD操作の前後に。イベントをディスパッチする別の重要な場所は、adminhtmlフォームブロック(該当する場合)です。これにより、管理フォームブロックを書き換えずにカスタム属性/フィールドを追加した場合、新しい入力フィールドを追加できます。(これはMagento 1用です)。例を見る


0

Magento 1の内部では、発生する自動起動イベントを通じてイベントを活用できます。必要なことは、モデルのプロパティ$_eventPrefix$_eventObjectプロパティを設定することだけです。また、'controller_action_predispatch_ ' . $this->getFullActionName()および'controller_action_postdispatch_' . $this->getFullActionName()自動的にコントローラのイベント。それらはあなたをそこに大部分連れて行くことができます。

Magento 2では、クラス内でメソッドを公開します。これにより、プラグインがメソッドをインターセプトできます。これに従えば、カスタムイベントを作成する必要はありません。

これがお役に立てば幸いです!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.