2

zf2에서 코드를 추적하면 응용 프로그램 서비스가 등록되는 위치를 찾을 수 없습니다. 여기 application.phpzf2의 loadModules.post는 기능입니까?

public static function init($configuration = array()) 
{ 
    $smConfig = isset($configuration['service_manager']) ? $configuration['service_manager'] : array(); 
    $serviceManager = new ServiceManager(new Service\ServiceManagerConfig($smConfig)); 
    $serviceManager->setService('ApplicationConfig', $configuration); 
    $serviceManager->get('ModuleManager')->loadModules(); 
    return $serviceManager->get('Application')->bootstrap(); 
} 

코드 "$ serviceManager->의 get ('응용 프로그램')"의 코드 응용 프로그램 서비스를받을 것입니다. 그러나 응용 프로그램 서비스는 어디에 등록 되었습니까?

그런 다음 응용 프로그램 서비스가 ZF2/library의 "$ this-> getEventManager() -> trigger (ModuleEvent :: EVENT_LOAD_MODULES_POST, $ this, $ this-> getEvent())"코드 줄과 관련되어 있음을 알게되었습니다. /Zend/MoudleManager/MoudleManager.php

public function loadModules() 
{ 
    if (true === $this->modulesAreLoaded) { 
     return $this; 
    } 

    $this->getEventManager()->trigger(ModuleEvent::EVENT_LOAD_MODULES, $this, $this->getEvent()); 

    /** 
    * Having a dedicated .post event abstracts the complexity of priorities from the user. 
    * Users can attach to the .post event and be sure that important 
    * things like config merging are complete without having to worry if 
    * they set a low enough priority. 
    */ 
    $this->getEventManager()->trigger(ModuleEvent::EVENT_LOAD_MODULES_POST, $this, $this->getEvent()); 

    return $this; 
} 

또 다른 질문은 "ModuleEvent :: EVENT_LOAD_MODULES_POST, 즉 트리거 기능의 loadModules.post.The 첫 PARAM 함수 이름이라는 것이다. 그래서이 loadModules.post입니다 어떤 기능을 정의 했습니까?

미리 감사드립니다.

답변

3

먼저 질문을 드리겠습니다. 트리거 메소드의 첫 번째 매개 변수는 이 아니며 함수입니다.이 이름은 단순히 이름입니다. 일반적으로이 이름은 트리거되는 메소드를 미러링하며 선택적으로 ".pre", ". post"등과 같이 더 많은 컨텍스트를 제공하는 접미사를 사용합니다.

"loadModules.post"는 모든 모듈이로드 된 후 ModuleManager::loadModules()에 의해 트리거되는 이벤트입니다. 이벤트가 트리거되면 해당 이벤트의 모든 리스너가 제공된 매개 변수로 트리거됩니다. 이벤트 객체 자체도이 경우 ModuleManager가 될 "대상"을 갖습니다.

"응용 프로그램"서비스에 관해서는 MVC 계층의 내부를 조사해야합니다. 대부분의 MVC 서비스는 Zend\Mvc\Service\ServiceListenerFactory에 정의되어 있습니다. 이 클래스를 보면 ApplicationZend\Mvc\Service\ApplicationFactory을 사용하여 Application 인스턴스를 만들도록 지정됩니다. ServiceListenerFactory은 ModuleManager를 작성하는 팩토리의 일부로 검색됩니다. 그것은 약간 간접적 인 것이지만 관계는 작업 순서와 객체 간의 관계에 의해 정의됩니다.

+0

Matthew, 고맙습니다. 그리고 감사합니다. – Leo

1

ServiceListener 인스턴스를 생성 할 때 대부분의 Zend \ ServiceManager \ ServiceManager 등록 서비스는 ServiceListener 팩토리 Zend\Mvc\Service\ServiceListenerFactory에 의해 구성됩니다.

기본 구성은 실제로 ServiceListenerFactory::defaultServiceConfig에 저장됩니다. (코드를 살펴보면 'Application'별칭이 거기에 정의되어 있음을 알 수 있습니다)

두 번째 질문에 대해 ModuleEvent :: EVENT_LOAD_MODULES는 모듈을 식별하는 데 사용되는 ModuleEvent 상수 중 하나입니다 이벤트를로드하는 다른 모듈.

실제로 응용 프로그램에 의해 다른 단계에서 트리거되는 네 개의 모듈 이벤트가 있습니다. 나는 아직 그 사건들을 사용할 수있는 기회가 없었으며 그것들은 대부분 프레임 워크 자체에 의해 사용된다고 생각한다. 지금까지 Zend \ Mvc \ MvcEvent 관련 이벤트 만 사용할 수있는 기회가있었습니다.