zf2 - 在 form/controller 工厂获取控制器插件
zf2 - getting controller plugins in form/controller factory
是否可以从 form/controller 工厂(任何实现 FactoryInterface 的工厂)访问控制器插件?
我有一个表单工厂,我想根据请求参数设置表单操作,但需要从配置中定义的路由访问 url。
所以在控制器中我会使用 url 控制器插件:
$form->setAttribute('action', $this->url()->fromRoute('appointment.add', array('clientId' => $clientId)));
...我如何在工厂中访问它?例如:
class MyFormFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator){
$serviceManager = $serviceLocator->getServiceLocator();
//...snip...
$form = new AddAppointmentForm($client);
$serviceManager->get('ControllerPluginManager');
$url = $controllerPluginManager->get('Url');
die($url->fromRoute('appointment.add', ['clientId' => $clientId]));
return $form;
}
您可以在工厂中创建 \Zend\Mvc\Controller\PluginManager 的实例,并且可以轻松获得 url 或您想要的任何插件。只是一个小问题,你不能在你的插件管理器中设置你的控制器。因此,依赖于控制器的插件将无法正常工作。
在非控制器上下文中使用控制器插件不是好的做法。
要使用 ZF2 路由器 assemble URL,您可以只使用 ServiceManager
.
中也可用的路由器
$router = $serviceManager->get('HttpRouter');
$url = $router->assemble(['clientId' => $clientId], ['name' => 'appointment.add']);
是否可以从 form/controller 工厂(任何实现 FactoryInterface 的工厂)访问控制器插件?
我有一个表单工厂,我想根据请求参数设置表单操作,但需要从配置中定义的路由访问 url。
所以在控制器中我会使用 url 控制器插件:
$form->setAttribute('action', $this->url()->fromRoute('appointment.add', array('clientId' => $clientId)));
...我如何在工厂中访问它?例如:
class MyFormFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator){
$serviceManager = $serviceLocator->getServiceLocator();
//...snip...
$form = new AddAppointmentForm($client);
$serviceManager->get('ControllerPluginManager');
$url = $controllerPluginManager->get('Url');
die($url->fromRoute('appointment.add', ['clientId' => $clientId]));
return $form;
}
您可以在工厂中创建 \Zend\Mvc\Controller\PluginManager 的实例,并且可以轻松获得 url 或您想要的任何插件。只是一个小问题,你不能在你的插件管理器中设置你的控制器。因此,依赖于控制器的插件将无法正常工作。
在非控制器上下文中使用控制器插件不是好的做法。
要使用 ZF2 路由器 assemble URL,您可以只使用 ServiceManager
.
$router = $serviceManager->get('HttpRouter');
$url = $router->assemble(['clientId' => $clientId], ['name' => 'appointment.add']);