Создайте форму как услугу в Symfony2
Что я хотел бы сделать с любого контроллера:
$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
Ты почти там, кажется. Чтобы получить объект Form из вашей службы, вы должны использовать FormFactoryInterface::create()
вместо FormFactoryInterface::createBuilder()
Причина, по которой $this->createForm()
работает в контроллерах, состоит в том, что каждый контроллер расширяет базовый контроллер , который реализует этот метод.
Я обнаружил, что моя способность IDE очень полезно ссылаться на определенные файлы Symfony, и я предлагаю вам использовать их, если вы уже этого не сделали. Также существует репозиторий git, который вы можете найти здесь.