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();
实际上,在使用它之前,您应该检查路由匹配是否存在