2017-04-22 70 views
0

是否可以从窗体/控制器工厂(实现FactoryInterface的任何工厂)访问控制器插件?zf2 - 在窗体/控制器工厂中获取控制器插件

我有一个表单工厂,我想根据请求参数设置表单动作,但需要从config中定义的路由访问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; 
    } 

回答

1

在非控制器上下文中使用控制器插件不是好习惯。 要使用ZF2路由器组装URL,您可以使用ServiceManager中也提供的路由器。

$router = $serviceManager->get('HttpRouter'); 
$url = $router->assemble(['clientId' => $clientId], ['name' => 'appointment.add']); 
+0

非常好,那正是我所希望的。我同意你在控制器上下文之外使用插件的原则,然而我认为可能会有一个通用/基础url助手,就像可用的视图助手一样。使用HttpRouter是理想的,谢谢。 –

+0

更可持续的方式是将表单工厂重构为服务。通过服务工厂实例化,传入服务管理器。只是一个练习提示,在那里,做到了 - 我们转而在控制器级别设置动作属性 - 有一些边缘情况下路由器不会包含当前信息,未来的支持工作将更少。 – davmor

0

您可以在您的工厂创建\ Zend的\的mvc \控制器\插件管理的实例,并可以很容易地得到你想要的网址或任何插件。只是一个小问题,你不能在你的插件管理器中设置你的控制器。所以,依赖于控制器的插件将无法正常工作。