2017-04-22 66 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 \控制器\插件管理的實例,並可以很容易地得到你想要的網址或任何插件。只是一個小問題,你不能在你的插件管理器中設置你的控制器。所以,依賴於控制器的插件將無法正常工作。