1

次のような状況があります: アプリケーション モジュールの 1 つでイベントをトリガーします。同じモジュールで、共有イベント マネージャー システムを介してそのトリガーをリッスンするイベント リスナーを作成します。この手順ではすべて正常に動作し、さらに作成しようとしました。そのイベントに対する異なるモジュールのリスナーとそれらも正常に機能し、すべてのリスナーが呼び出されます。

私が欲しいのは、複数の場所から同じイベントをトリガーできるシステムを持つことです。たとえば、「sendMail」トリガーをリッスンし、いくつかのアクションを実行するリスナーを持つメール送信モジュールを作成します。異なるモジュールから同じイベントをトリガーすることは可能ですか?

2 つの場所から同じイベントをトリガーしようとしましたが、共有イベントの attach メソッドは、最初のパラメーターを呼び出し元クラスの ID、つまりイベントをトリガーするクラスの ID として受け取ります。このようにして、イベントのみをトリガーできます。指定されたクラスから。私が望むのは、好きなだけ多くの場所からそのイベントをトリガーすることです。本当にありがとうございました!

4

3 に答える 3

2

共有イベント マネージャーではワイルドカードにアタッチできるため、fooソースに関係なくイベントにアタッチするには、次のようにします。

$sharedEventManager->attach('*', 'foo', ...);

詳細については、ワイルドカードに関する EventManager のドキュメント ページを参照してください: http://framework.zend.com/manual/current/en/tutorials/tutorial.eventmanager.html#wildcards

于 2015-01-25T19:42:15.903 に答える
1

Zend\EventManager\EventManagerAwareTraitまたは inherit fromを使用するZfcBase\EventManager\EventProviderと、リッスンする独自のイベント識別子を指定できます。

EventManagerAwareTrait::setEventManager()ここでメソッドに含まれるコードを見ると

https://github.com/zendframework/zf2/blob/master/library/Zend/EventManager/EventManagerAwareTrait.php#L44-L54

そしてZfcBase\EventManager\EventProvider::setEventManager()ここにも

https://github.com/ZF-Commons/ZfcBase/blob/master/src/ZfcBase/EventManager/EventProvider.php#L26-L37

このメソッドは、文字列または文字列の配列であると想定して、 という名前のプロパティを自動的に探します。$eventIdentifier存在する場合は、FQCN およびクラス名の既定の識別子とマージされます。

したがって、基本的には、イベント マネージャー対応のクラス (イベントをトリガーするクラス) にプロパティを追加するだけで、独自の識別子を追加できます。

<?php

namespace Somenamespace; 

use Zend\EventManager\EventManagerAwareInterface;

class EventTriggeringClass implements EventManagerAwareInterface
{
    use \Zend\EventManager\EventManagerAwareTrait;

    protected $eventIdentifier = 'SendMailIdentifier';

}

namespace Someothernamespace;

use Zend\EventManager\EventManagerAwareInterface;

class SomeOtherEventTriggeringClass implements EventManagerAwareInterface
{
    use \Zend\EventManager\EventManagerAwareTrait;

    protected $eventIdentifier = 'SendMailIdentifier';

}

リスナーはSendMailIdentifier、特定のクラスの FQCN をターゲットにするのではなく、にアタッチするだけで済みます。

もちろん、FQCN は setEventManager メソッドによってマージされた識別子の 1 つであるため、必要に応じて FQCN にアタッチすることもできます。

于 2015-01-23T16:36:34.417 に答える
0

共有イベント マネージャーを使用する理由は何ですか?

「操作」用のサービスを作成すると、新しいイベントマネージャーを初期化して、好きな場所にイベントを添付できます。そしてどこからともなく引き金を引く。

また、コードのレビューと読みやすさのために、イベント集計を添付することをお勧めします

于 2015-01-23T12:05:36.977 に答える