zf2 - получение плагинов контроллера в форме / фабрике контроллеров

Можно ли получить доступ к плагинам контроллера из фабрики форм / контроллеров (любая фабрика, реализующая 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;
    }

2 ответа

Решение

Не рекомендуется использовать подключаемые модули контроллера в неконтролируемом контексте. Чтобы собрать URL с маршрутизатором ZF2, вы можете просто использовать маршрутизатор, который также доступен в ServiceManager,

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

Вы можете создать экземпляр \Zend\Mvc\Controller\PluginManager на своей фабрике и легко получить URL или любой другой плагин, который вы хотите. Просто небольшая проблема, вы не можете установить свой контроллер в менеджере плагинов. Таким образом, зависимый от контроллера плагин НЕ будет работать должным образом.

Другие вопросы по тегам