Как определить путь в неконтроллерном классе в symfony2 - PullRequest
7 голосов
/ 26 марта 2012

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

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

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

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

Ответы [ 3 ]

16 голосов
/ 26 марта 2012

Вы можете передать службу 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 в вашем типе.

1 голос
/ 13 апреля 2014

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

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

0 голосов
/ 26 марта 2012

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

Дополнительная информация: Контейнер услуг .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...