Migration 检查\Zend\Mvc\Router\Http\Segment的扩展中是否存在控制器
我正在开发一个基于ZF2的遗留应用程序;不久前,我们升级到了ZF2的最新版本,现在我们的日志中充斥着关于弃用的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
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],],
)?如果您有一个已填充):)是的,我已经尝试过了,但这并没有真正起到帮助作用–该配置没有进入创建我的类的ServiceManager。跟踪完成后,我发现该配置在公共函数uu调用(ContainerInterface$container,//其他){返回新的ExtendedSegment($container->get($ControllerManager'),$options);}
$options
\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
中进行了初始化,并且我没有看到添加自定义项的调用路径。