1

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()大多数时候都可以工作,但有时当我从 3rd 方 api 调用我的应用程序时,我会收到此错误。

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

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

4

1 回答 1

1

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

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

此外,在我看来,您应该从当前路由匹配中获取参数,而不是从参数控制器插件中获取参数,例如

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

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

于 2016-11-02T15:36:08.810 回答