2017-04-22 6 views
0

フォーム/コントローラ工場(FactoryInterfaceを実装している工場)からコントローラプラグインにアクセスできますか?zf2 - フォーム/コントローラ工場でコントローラプラグインを取得する

リクエストパラメータに応じてフォームアクションを設定するフォームファクトリがありますが、configに定義されているルートからurlにアクセスする必要があります。

コントローラに私は、URLのコントローラプラグイン使用するのに対し、だから:私は工場でこれにアクセスする方法を...

$form->setAttribute('action', $this->url()->fromRoute('appointment.add', array('clientId' => $clientId))); 

を?例えばのようなもの:あなたはあなたの工場で\ Zendの\ MVC \コントローラ\ PluginManagerのインスタンスを作成することができ、簡単にURLを取得したり、あなたが好きなプラグインすることができます

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

コントローラー以外のコンテキストでコントローラープラグインを使用することをお勧めしません。 URLをZF2ルータに組み立てるには、ServiceManagerでも利用可能なルータを使用できます。

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

優秀な、それは私が望んでいたものです。私はコントローラのコンテキストの外で使用されているプラ​​グインのあなたの原則に同意するが、利用可能なビューヘルパーのようなユニバーサル/ベースのURLヘルパーがあるかもしれないと思った。 HttpRouterの使用は理想的です。ありがとうございます。 –

+0

より持続可能な方法は、フォームファクトリをサービスにリファクタリングすることです。それをサービスファクトリ経由でインスタンス化し、サービスマネージャに渡します。コントローラのレベルでアクション属性を設定することに移りました。ルータに現在の情報が含まれていないといういくつかのエッジケースがあり、将来のサポート努力は少なくなります。 – davmor

0

。ちょっとした問題ですが、プラグインマネージャーでコントローラを設定することはできません。したがって、コントローラ依存のプラグインは正しく動作しません。

関連する問題