0

私は、新しいイベントをトリガーしてそれをリッスンする方法を示す本に従っています。このイベントはチャネル 25 と呼ばれ、テスト用の架空のデータが含まれています。error_log を入れてイベントプロセスをトラップし、その動作を確認しました。イベントはトリガーされますが、何らかの理由で聞くことができません。ここにmodule.phpのコピーがあります

イベントをトリガーする場所とそれをリッスンする場所のセクションにコメントしました。

<?php

namespace Debug;

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\Mvc\ModuleRouteListener;
use Zend\ModuleManager\ModuleManager;
use Zend\eventManager\Event;
use Zend\Mvc\MvcEvent;
use Zend\EventManager\EventManager; //manage events (create/listen for events)

class Module implements AutoloaderProviderInterface
{

    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }


    public function init(ModuleManager $ModuleManager)
    {
        $eventManager = $ModuleManager->getEventManager();
        $eventManager->attach('loadModules.post', array($this, 'loadedModulesInfo'));

        //create new event
        $event = new EventManager('channel-25');
        $event->trigger('new song', null, array('artist' => 'Adele'));
        error_log('New Event Triggered');
    }

    public function loadedModulesInfo(Event $event)
    {
        $moduleManager = $event->getTarget();
        $loadedModules = $moduleManager->getLoadedModules();
        error_log(var_export($loadedModules, true));
    }

    public function onBootstrap(MvcEvent $event)
    {
        //Now i will be listening for my sample event
        $eventManager = $event->getApplication()->getEventManager();
        $sharedEventManager = $eventManager->getSharedManager();
        $sharedEventManager->attach('channel-25', 'new song', function(Event $event) {
            $artist = $event->getParam('artist');
            error_log('Found the Event. The artist is: ' . $artist);
        });
    }

    public function handleError(MvcEvent $event)
    {
        $controller = $event->getController();
        $error = $event->getParam('error');
        $exception = $event->getParam('exception');
        $message = 'Error: ' . $error;

        if($exception instanceof \Exception)
        {
            $message .= ', Exception(' . $exception->getMessage() . '):' . $exception->getTraceAsString();
        }

        error_log($message);
    }


}
4

2 に答える 2

0

I figured it out. I moved the Event Trigger to the index controller and it worked. For anyone else trying to figure out events this is what i did:

indexController.php

namespace Debug\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Mvc\MvcEvent;
use Zend\EventManager\EventManager;


class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        //create new event
        $event = new EventManager('channel-25');
        $event->trigger('new song', null, array('artist' => 'Adele'));
        error_log('New Event Triggered');
    }
}

Module.php

<?php

namespace Debug;

use Zend\ModuleManager\ModuleManager;
use Zend\eventManager\Event;
use Zend\Mvc\MvcEvent;

class Module
{
    public function onBootstrap(MvcEvent $event)
    {
        //Now i will be listening for my sample event
        $eventManager = $event->getApplication()->getEventManager();
        $sharedEventManager = $eventManager->getSharedManager();
        $sharedEventManager->attach('channel-25', 'new song', function(Event $event) {
            $artist = $event->getParam('artist');
            error_log('got the new song: ' . $artist);
        });
    }


    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

}
于 2013-10-31T02:30:20.173 に答える
0

自分で解決策を見つけていることがわかります。コードが機能しない理由は、リッスンを開始する前にイベントをトリガーしているためです。2番目の投稿では、イベントのトリガーは、すでにリスナーが存在する後に行われます。これは正しいシーケンスです。

--

PS: Zend Framework 2 の学習に興味がある人は、http://LearnZF2.comを試すことができます。

于 2013-10-31T09:42:30.853 に答える