2015-10-20 4 views
0

Я не могу заставить мои события отключиться. Это мой первый раз, играя с ними. Если вы посмотрите, я создаю событие в методе 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

EventManager вы получаете от ModuleManager это отличается EventManager чем Application «s EventManager который вы позволяете инициировать событие do.

Поскольку во время инициализации модуля приложение еще не доступно, вы должны привязать своего слушателя к событию через SharedManager.

Так прикрепление к событию приложения do бы как этот

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

Пожалуйста, обратите внимание, что общий менеджер требует (в) идентификатор EventManager, который, как ожидается, вызвать событие, которое в данном случае является (и часто is) имя класса Application.

Смежные вопросы