控制器必须实现 InjectApplicationEventInterface

Controllers must implement 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() 大部分时间都有效,但有时当我从第 3 方调用我的应用程序时 api 我会收到此错误。

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

我没有看到通话有任何不同。我只需要澄清这个错误代表什么,所以如果我需要更改应用程序的设计,我应该这样做。

这只是一个猜测,但我认为您通过服务管理器使用的 params controller 插件在某些情况下没有分配控制器,这就是为什么您应该只使用它 控制器中。您应该能够在 https://github.com/zendframework/zendmvc/blob/master/src/Controller/Plugin/Params.php#L110.

处调试它

如果您访问无效的路由或类似的东西,可能会发生这种情况。

此外,我认为您应该从当前路由匹配中获取参数而不是参数 controller 插件,例如

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

的确,您应该在使用之前检查路由匹配是否存在。