Создать форму как сервис в Symfony2 - PullRequest
26 голосов
/ 13 ноября 2011

То, что я хотел бы сделать с любого контроллера, это:

$register = $this->get('register_manager');
return $this->render(
    'AcmeUserBundle:Account:register.html.twig',
     array(
         'form' => $register->getRegistrationForm(),
         )
 );

И в моем шаблоне

<form>
    {{ form_widget(form) }}
</form>

Вот как я настроил до сих пор

По моему Acme/UserBundle/Resources/config/services.yml у меня

parameters:
    register_manager.class: Acme\UserBundle\Manager\RegisterManager

services:
    register_manager:
        class:     %register_manager.class%
        arguments: [@form.factory]

В RegisterManager.php У меня

namespace Acme\UserBundle\Manager;

use Acme\UserBundle\Form\Type\RegistrationType;
use Symfony\Component\Form\FormFactoryInterface;

class RegisterManager
{

    protected $formFactory;

    public function __construct(FormFactoryInterface $formFactory)
    {
        $this->formFactory = $formFactory;
    }


    public function getRegistrationForm()
    {
        return $this->formFactory->createBuilder(new RegistrationType());
    }
}

А в Acme\UserBundle\Form\Type\RegistrationType у меня есть:

namespace Acme\UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('username','text');
        $builder->add('email','email');
        $builder->add('password','password');
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Acme\UserBundle\Entity\User',
        );
    }

    public function getName()
    {
        return 'registration';
    }
}

Я знаю, что RegistrationType() работает так, как он у меня был в контроллере. Моя проблема с настройкой RegisterManager в качестве службы, я не могу найти там нужные компоненты и не знаю, где искать.

1 Ответ

20 голосов
/ 13 ноября 2011

Кажется, ты почти у цели. Чтобы получить объект Form от вашего сервиса, вы должны использовать FormFactoryInterface::create() вместо FormFactoryInterface::createBuilder()

Причина, по которой $this->createForm() работает в контроллерах, заключается в том, что каждый контроллер расширяет базовый контроллер , что и реализует этот метод.

Мне показалась полезной способность моей среды IDE связываться с конкретными файлами Symfony, и я предлагаю вам использовать один из них, если это уже не так. Также есть git-репозиторий, который вы можете найти здесь .

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