我有一个在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
我看不出通话有什么不同。我只是需要澄清这个错误代表什么,所以如果我需要改变应用程序的设计,我应该这样做。
这只是一个猜测,但我认为params 控制器插件,你正在使用通过服务管理器在某些情况下没有分配控制器,这就是为什么你应该只使用它在一个控制器。您应该能够在https://github.com/zendframework/zendmvc/blob/master/src/Controller/Plugin/Params.php#L110上调试它。
如果你访问了一个无效的路由或类似的情况,可能会发生这种情况。
此外,在我看来,你应该从当前路由匹配中获取参数,而不是从params 控制器插件中获取,比如
$event->getRouteMatch()->getParams();