0

あるモジュールでイベントを設定し、別のモジュールのコントローラーでそれをトリガーしようとしています。共有イベントマネージャーを使用していますが、何か問題が発生しているようです。

モジュール1:

public function onBoostrap(Event $e)
        {
              $sem = $e->getTarget()->getEventManager()->getSharedEventManager();
              $sem->attach('checkSomething', function (){
                          die("checked");
              });
        }

Module2コントローラー:

 public function checkAction ()
        {
                $this->getEventManager()->trigger('checkSomething');
}

あなたたちは私が間違っているかもしれないことを知っていますか?または、これを行うためのより良い(正しい)方法がある場合。

4

2 に答える 2

3

Yassine のソリューションの問題は、イベントが「Zend\Mvc\Application」に添付されていることです。このイベント ID はコントローラーでは使用できません

これは、アクションで次のコードを実行することで確認できます

print_r($this->getEventManager()->getIdentifiers());

結果は次のようになります

Array ( 
    [0] => Zend\Stdlib\DispatchableInterface 
    [1] => Zend\Mvc\Controller\AbstractController 
    [2] => Application\Controller\TestController 
    [3] => Zend\Mvc\Controller\AbstractActionController 
    [4] => Application 
)

モジュールの問題を解決するには、イベントを「アプリケーション」識別子にアタッチし、アクションでイベントをトリガーします。

それで:

/*Module*/
public function onBootstrap($e)
{
    $eventManager = $e->getApplication()->getEventManager();
    $sem          = $eventManager->getSharedManager();

    $sem->attach('Application', 'checkSomething', function () {
        echo "checked";
        /* do more stuff here */
    }, 100);

}
/* a action in a controller */
$this->getEventManager()->trigger('checkSomething');

これにより、

checked

これで、イベントが正常にトリガーされました。

于 2013-03-30T18:00:22.343 に答える
0

イベント マネージャのインスタンスを含むリソースの識別子を指定する必要があります。多くのクラス (Application、ModuleManager...) は、含まれる EventManager インスタンス内でクラス名を識別子として使用します。

添付ファイルの行は次のようになります。

$sem->attach('Zend\Mvc\Application','checkSomething', function (){
                      die("checked");
          });

(更新) コントローラーから、アプリケーション EventManager を呼び出す必要があります。

$this->getServiceLocator()->get('application')->getEventManager()->trigger('chec‌​kSomething');

乾杯、

ヤシン

于 2012-10-30T14:23:30.623 に答える