2012-10-30 2 views
0

한 모듈에서 이벤트를 설정하고 다른 모듈의 컨트롤러에서 트리거하려고합니다.ZF2 공유 이벤트

으로 Module1 .. 내가 공유 이벤트 관리자를 사용하고 있지만, 뭔가 잘못하고 메신저를 보인다

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

모듈 2 컨트롤러 :

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

가 수행을 너희들이 내가 잘못하고 될 수 있습니다 알고 ? 또는이 작업을 수행하는 것이 더 올바른 (올바른) 방법이있는 경우 ...

답변

0

이벤트 관리자의 인스턴스를 포함하는 리소스의 식별자를 지정해야합니다. 많은 클래스 (Application, ModuleManager ...)는 포함 된 EventManager 인스턴스 내에서 클래스 이름을 식별자로 사용합니다.

첨부 파일 라인은 다음과 같아야합니다

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

당신이 응용 프로그램 개의 EventManager 호출해야 컨트롤러에서 (업데이트) :

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

환호,

야신

+0

여전히 작동하지 않습니다 .. 아마도 sharedmanager에 대해 뭔가가 있습니까? – MGP

3

Yassine의 해결책에있는 문제는 사건이 atta다는 것을이다 'Zend \ Mvc \ Application'에 저장됩니다. 이 이벤트 식별자는 컨트롤러에서 사용할 수 없습니다

당신은 행동에

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 
) 

문제를 해결하기

처럼 다음 코드를 실행하여이를 확인할 수 있습니다 모듈에서 이벤트를 '응용 프로그램'식별자 에 첨부 한 다음 작업에서 이벤트를 트리거하십시오. 그래서

:이

checked 

초래한다 그래서 당신이 성공적으로 이벤트를 트리거 한

/*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'); 

.