Контроллеры должны реализовывать InjectApplicationEventInterface

У меня есть код, который выполняется, прежде чем страница отображается в Module.php как это.

$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() работает в большинстве случаев, но иногда, когда я вызываю приложение из стороннего API, я получаю эту ошибку.

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

Я не вижу ничего, что отличается в звонках. Мне просто нужно уточнить, что представляет собой эта ошибка, поэтому, если мне нужно изменить дизайн приложения, я должен это сделать.

1

Решение

Это всего лишь предположение, но я думаю, что параметры контроллер Плагин, который вы используете через сервис-менеджер, в некоторых случаях не имеет назначенного контроллера, поэтому его следует использовать только внутри контроллер. Вы должны быть в состоянии отладить его в https://github.com/zendframework/zendmvc/blob/master/src/Controller/Plugin/Params.php#L110.

Может быть, это происходит, если вы получаете доступ к неверному маршруту или что-то вроде этого.

Кроме того, по моему мнению, вы должны получить параметры из текущего матча маршрута вместо параметров контроллер плагин, как

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

В самом деле, вы должны проверить, существует ли соответствие маршрута перед его использованием.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]