控制器必须实现InjectApplicationEventInterface

时间:2016-11-02 14:16:55

标签: 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(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 个答案:

答案 0 :(得分:1)

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

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

在我看来,你应该从当前的路线匹配而不是params controller 插件中获取参数,比如

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

实际上,在使用之前,您应该检查路线匹配是否存在。