Php 控制器必须实现InjectApplicationEventInterface
我有一个在Php 控制器必须实现InjectApplicationEventInterface,php,zend-framework,zend-framework3,zf3,Php,Zend Framework,Zend Framework3,Zf3,我有一个在Module.php中呈现页面之前执行的代码,如下所示 $eventManager->attach(MvcEvent::EVENT_RENDER, function(MvcEvent $event) { /** @var ServiceManager $sm */ $sm = $event->getParam('application')->getServiceManager(); $logger = $sm->get(LogServ
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调用我的应用程序时,会出现此错误
控制器必须实现Zend\Mvc\InjectApplicationEventInterface才能使用此插件
我看不出电话里有什么不同。我只需要澄清这个错误代表什么,所以如果我需要更改应用程序的设计,我应该这样做。这只是一个猜测,但我认为您通过service manager使用的params控制器插件在某些情况下没有分配控制器,这就是为什么您应该只在控制器内部使用它。您应该能够在上调试它
如果您访问无效的路由或类似的内容,可能会发生这种情况
$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 **/
}
此外,我认为您应该从当前路由匹配中获取参数,而不是从params控制器插件中获取参数,如
$event->getRouteMatch()->getParams();
实际上,在使用它之前,您应该检查路由匹配是否存在