У меня есть класс построителя форм, который наследует от 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
Вы можете определить этот класс как услугу и ввести в нее маршрутизатор.
Дополнительная информация: Сервисный контейнер .