2016-11-02 2 views
1

페이지가 렌더링되기 전에 실행되는 코드가 Module.php입니다.컨트롤러는 InjectApplicationEventInterface를 구현해야합니다.

$eventManager->attach(MvcEvent::EVENT_RENDER, function(MvcEvent $event) { 

    /** @var ServiceManager $sm */ 
    $sm = $event->getParam('application')->getServiceManager(); 

    $logger = $sm->get(LogService::class)->getLogger(); 
    $themeResolver = $sm->get(ThemeResolveService::class); 

    $df = $sm->get(DataFetchService::class); 

    $params = $sm->get('ControllerPluginManager')->get('params'); 
    $security = $sm->get(SecurityService::class); 

    try { 
     $cleanedParams = $security->clean($params->fromRoute()); 
    } catch (\Exception $e) { 
     echo $e->getMessage(); 
     $logger->info($e->getMessage()); 
     die(); 
    } 

    /** theme resolving code **/ 
} 

내가 가진 문제는이 라인이다 :

$cleanedParams = $security->clean($params->fromRoute()); 

$params->fromRoute() 시대의 대부분의 작동하지만 내가 제 3 자 API에서 내 응용 프로그램을 호출 할 때 때때로 나는이 오류가 발생합니다.

Controllers must implement Zend\Mvc\InjectApplicationEventInterface to use this plugin

나는 호출에 다른 아무것도 표시되지 않습니다. 난 그냥 응용 프로그램의 디자인을 변경해야 할 경우이 오류를 나타내는 무슨 설명이 필요, 그렇게해야합니다.

답변

1

그냥 추측이지만, 나는 당신이 단지 컨트롤러 내부에 그것을 를 사용해야하는 이유 PARAMS는 서비스 관리자를 통해 사용하는 플러그인이 어떤 경우에는 할당 된 컨트롤러가 없습니다 컨트롤러, 그게 전부라고 생각합니다. https://github.com/zendframework/zendmvc/blob/master/src/Controller/Plugin/Params.php#L110에서 디버깅 할 수 있어야합니다.

잘못된 경로 나 이와 유사한 경로에 액세스하면 이런 일이 발생할 수 있습니다. 내 의견

Futhermore 당신은 실제로

$event->getRouteMatch()->getParams(); 

routematch이 그것을 사용하기 전에 존재 처리 여부는 확인해야처럼 PARAMS 컨트롤러 플러그인 대신 현재의 경로 매치에서 PARAMS을 얻어야한다.