应用程序模块中未触发事件

时间:2015-10-20 23:46:02

标签: events zend-framework2 zend-framework-mvc

我似乎无法将我的活动解雇。这是我第一次和他们一起玩。如果你看,我在init方法中创建一个事件,然后我尝试在onBootstrap方法中将其关闭。该事件应该产生一个带有字符串的模具,但事实并非如此。任何帮助将不胜感激。

namespace Application;

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ControllerProviderInterface;
use Zend\ModuleManager\Feature\BootstrapListenerInterface;
use Zend\ModuleManager\Feature\ServiceProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\ModuleManager\Feature\InitProviderInterface;
use Zend\ModuleManager\Feature\ViewHelperProviderInterface;
use Zend\ModuleManager\ModuleManagerInterface;
use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
use Zend\EventManager\EventInterface;
use Doctrine\DBAL\DriverManager;

class Module implements 
    AutoloaderProviderInterface,
    ControllerProviderInterface,
    BootstrapListenerInterface,
    ServiceProviderInterface,
    ConfigProviderInterface,
    InitProviderInterface,
    ViewHelperProviderInterface
{
    public function init(ModuleManagerInterface $manager)
    {
        $eventManager = $manager->getEventManager();
        $eventManager->attach('do',function($e){
            $event = $e->getName();
            $target = get_class($e->getTarget());
            $params = $e->getParams();
            $str = sprintf(
                'Handled event \"%s\" on target \"%s\", with parameters %s',
                $event,
                $target,
                json_encode($params)
            );
            die($str);
        });
    }

    public function onBootstrap(EventInterface $e)
    {
        $this->attachEventManagerToModuleRouteListener($e);        
        $this->setupDoctrineConnectionMappings($e);
        $eventManager = $e->getApplication()->getEventManager();
        $eventManager->trigger('do',$this,array('j','o','n'));
    }

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

    public function getServiceConfig()
    {
        return include __DIR__ . '/config/services.config.php';
    }

    public function getControllerConfig()
    {
        return include __DIR__ . '/config/controllers.config.php';
    }

    public function getViewHelperConfig()
    {
        return include __DIR__ . '/config/view.config.php';
    }

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

    private function attachEventManagerToModuleRouteListener(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);
    }

    private function setupDoctrineConnectionMappings(MvcEvent $e)
    {
        $driver = $e->getApplication()->getServiceManager()->get('doctrine.connection.orm_default');
        $platform = $driver->getDatabasePlatform();
        $platform->registerDoctrineTypeMapping('enum', 'string');
        $platform->registerDoctrineTypeMapping('set', 'string');
    }
}

1 个答案:

答案 0 :(得分:1)

您从EventManager获得的ModuleManagerEventManager的{​​{1}}不同Application,您可以触发事件EventManager do 1}}。

由于在模块初始化期间应用程序尚不可用,您必须通过SharedManager将监听器绑定到事件。

因此,附加到应用程序的事件do会像这样

$sharedManager = $manager->getEventManager()->getSharedManager();
$sharedManager->attach(Application::class, 'do', function($e) {
    // event code
});

请注意,共享管理器需要事件管理器的(一个)标识符,该标识符可能会触发事件,在这种情况下是Application的类名称。