Migration 检查\Zend\Mvc\Router\Http\Segment的扩展中是否存在控制器

Migration 检查\Zend\Mvc\Router\Http\Segment的扩展中是否存在控制器,migration,zend-framework3,Migration,Zend Framework3,我正在开发一个基于ZF2的遗留应用程序;不久前,我们升级到了ZF2的最新版本,现在我们的日志中充斥着关于弃用的getServiceLocator()的警告 我正在寻找一种方法来检查扩展\Zend\Mvc\router\Http\Segment的路由器中是否存在控制器;目前,来源如下: 受保护的功能是InvokableController($controller) { 返回$this->getServiceLocator()->get('ControllerLoader')->has($contr

我正在开发一个基于ZF2的遗留应用程序;不久前,我们升级到了ZF2的最新版本,现在我们的日志中充斥着关于弃用的
getServiceLocator()
的警告

我正在寻找一种方法来检查扩展
\Zend\Mvc\router\Http\Segment
的路由器中是否存在控制器;目前,来源如下:

受保护的功能是InvokableController($controller)
{
返回$this->getServiceLocator()->get('ControllerLoader')->has($controller);
}
这将导致关于
getServiceLocator()
弃用的警告


到目前为止,我还没有找到任何方法将
ControllerLoader
作为DI。是否有任何方法可以通过工厂创建路由器并获取DI(我想应用程序中还有其他地方可以使用DI)或任何其他方法来检查控制器是否存在?

您应该使用工厂模式,这是ZF2从2.5版开始所要求的,在您所在的版本中不鼓励在控制器中使用ServiceManager,并且从ZF3+中删除。在控制器/服务工厂中,使用ContainerInterface(与当前ServiceManager同义)获取ControllerManager(
$container->get('ControllerManager')
,如果内存正常)。如果计划ZF3升级,请确保开始从控制器迁移这些注入的ServiceManager实例。这是我的问题,@rkeet–该类扩展了
\Zend\Mvc\Router\Http\Segment
,它具有
公共静态函数工厂($options=[])
方法。此方法由
\Zend\Mvc\Router\RouteInvokableFactory::\uu invoke
调用。不幸的是,
factory()
方法只接收选项,没有
$container
。我试图在数组
service\u manager
中的
application.config.php
中添加工厂方法,但找不到正确的键–
factories
无效。您是否尝试过为自己的扩展段实现注册自己的工厂(我想,
'service\u manager'=>['Factorys'=>[ExtendedSegment::class=>ExtendedSegmentFactory::class],],
)?如果您有一个
公共函数uu调用(ContainerInterface$container,//其他){返回新的ExtendedSegment($container->get($ControllerManager'),$options);}$options
已填充):)是的,我已经尝试过了,但这并没有真正起到帮助作用–该配置没有进入创建我的类的ServiceManager。跟踪完成后,我发现该配置在
\Zend\Mvc\Router\Http\TreeRouteStack::init
中进行了初始化,并且我在添加自定义项的调用路径上看不到任何方法。您应该使用对于工厂模式,ZF2从2.5版开始就需要此模式,并且在您所在的版本中不鼓励在控制器中使用ServiceManager,并从ZF3+中删除。在控制器/服务工厂中,使用ContainerInterface(当前ServiceManager的同义词)获取ControllerManager(
$container->get)('ControllerManager')
如果内存足够的话。如果计划ZF3升级,请确保开始从控制器迁移这些注入的ServiceManager实例。这是我的问题,@rkeet–该类扩展了
\Zend\Mvc\Router\Http\Segment
,它具有
公共静态函数工厂($options=[])
方法。此方法由
\Zend\Mvc\Router\RouteInvokableFactory::\uu invoke
调用。不幸的是
工厂()
method只接收选项,但没有
$container
。我试图在
application.config.php
数组
service\u manager
中添加工厂方法,但我找不到正确的键–
工厂
不起作用。您是否尝试为自己的扩展段imp注册自己的工厂实现(我想,注册到
'service\u manager'=>['factories'=>[ExtendedSegment::class=>ExtendedSegmentFactory::class],
)?如果你有一个
公共函数调用(ContainerInterface$container,//其他){返回新的ExtendedSegment($container->get('ControllerManager'),$options);}
它看起来应该可以工作。(显然,工厂中的代码和
$options
已填充):)是的,我已经尝试过了,但这并没有真正起到帮助作用–该配置没有进入创建我的类的ServiceManager。跟踪完成后,我发现该配置在
\Zend\Mvc\Router\Http\TreeRouteStack::init
中进行了初始化,并且我没有看到添加自定义项的调用路径。