Intereting Posts
Как настроить PHP для получения разрешения на создание каталогов и создание файлов? мое изображение captcha, которое не отображается на моей странице при вызове captcha.php Уведомление push iOS не работает при использовании планировщика crontab Получение страны-посетителя от их IP-адресов Возможно ли, чтобы preg заменил уникальные переменные на строку? Обнаруживать основные цвета в изображении с помощью PHP Codeigniter – Создание собственного помощника php codeigniter – хелпер формы – Как реализовать set_value на радиовходе Как перенаправить URL-адрес после определения некоторых переменных с помощью curl_init заменить английские котировки на немецкие котировки Проблемы с переносом сайта WordPress из локального сайта в галерею NextGen Перезагрузите содержимое div afer регулярного промежутка времени Использование MD5 в symfony2 security.yml для устаревших пользователей Вмешательство не изменяет размер больших файлов Получайте количество будних дней в данном месяце

Как разрешить путь в классе non-контроллера в symfony2

У меня есть класс построителя форм, который наследует от AbstractType и мне нужно решить такой путь:

 $uri = $router->generate('blog_show', array('slug' => 'my-blog-post')); 

Поскольку класс не является дочерним элементом Controller у меня нет доступа к маршрутизатору. Есть идеи?

Как насчет передачи маршрутизатора классу во время строительства?

Вы можете передать услугу router через конструктор в ваш тип формы. Зарегистрируйте свою форму как услугу с тегом form.type добавьте к ней сервис router .

 <?php namespace Vendor\Bundle\AppBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Bundle\FrameworkBundle\Routing\Router; class PostType extends AbstractType { /** * @var Router */ private $router; /** * @param Router */ public function __construct(Router $router) { $this->router = $router; } /** * @return string */ public function getName() { return 'post'; } // ... } 

Зарегистрируйте его как услугу:

 services: form.type.post: class: Vendor\Bundle\AppBundle\Form\Type\PostType arguments: [ @router ] tags: - { name: form.type } 

И используйте его в своем контроллере следующим образом:

 public function addAction(Request $request) { $post = new Post(); $form = $this->createForm('post', $post); // ... } 

Поскольку вы зарегистрировали свой тип формы как службу с тегом form.type , вы можете просто использовать его имя вместо new PostType() . И вы можете получить доступ к router как $this->router в своем типе.

Если вы собираетесь использовать свой класс построителя форм в каком-то контроллере, вы можете сделать это более простым, а построитель форм будет более гибким:

 public function someAction() { //... $task = new Task(); $form = $this->createForm(new TaskType(), $task, array( 'action' => $this->generateUrl('target_route'), 'method' => 'GET', )); } 

Нет необходимости устанавливать URL-адрес в классе типа формы. Подробнее здесь: http://symfony.com/doc/current/form/action_method.html

Вы можете определить этот класс как услугу и ввести в нее маршрутизатор.

Дополнительная информация: Сервисный контейнер .