Zend framework2 zf2-在窗体/控制器工厂中获取控制器插件

Zend framework2 zf2-在窗体/控制器工厂中获取控制器插件,zend-framework2,zend-servicemanager,Zend Framework2,Zend Servicemanager,是否可以从表单/控制器工厂(任何实现FactoryInterface的工厂)访问控制器插件 我有一个表单工厂,我想根据请求参数设置表单操作,但需要从配置中定义的路由访问url 因此,在控制器中,我将使用url控制器插件: $form->setAttribute('action', $this->url()->fromRoute('appointment.add', array('clientId' => $clientId))); …我怎样才能在工厂里访问它?例如: c

是否可以从表单/控制器工厂(任何实现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路由器组装URL,您只需使用路由器即可,该路由器也可在
ServiceManager
中找到

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

太好了,这正是我所希望的。我同意您在控制器上下文之外使用插件的原则,但是我认为可能有一个通用/基本url帮助程序,比如可用的视图帮助程序。使用HttpRouter非常理想,谢谢。更可持续的方法是将表单工厂重构为服务。通过服务工厂实例化它,传递给服务管理器。只是一个实践提示,我们已经做到了--我们开始在控制器级别设置action属性--有些边缘情况下路由器将不包含当前信息,未来的支持工作将更少。