2016-11-02 6 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 партии апи я получаю эту ошибку.

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 на мой взгляд, вы должны получить параметры из текущего матча маршрута вместо Params контроллер плагин, как

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

Действительно вы должны проверить Wheter routematch существует, прежде чем использовать его.