在Symfony2中将表单创建为服务

ed2*_*209 26 php symfony

我希望能从任何控制器做的是:

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

在我的模板中

<form>
    {{ form_widget(form) }}
</form>
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的设置方式

在我的Acme/UserBundle/Resources/config/services.yml

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

services:
    register_manager:
        class:     %register_manager.class%
        arguments: [@form.factory]
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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';
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道RegistrationType()我在控制器中有它的作品.我的问题是设置RegisterManager为服务,我无法在那里获得正确的组件,我不知道在哪里看.

gil*_*den 20

看起来你几乎就在那里.要从服务中获取Form对象,您应该使用FormFactoryInterface::create()而不是FormFactoryInterface::createBuilder()

$this->createForm()在控制器中工作的原因是因为每个控制器都在扩展基本控制器,这恰好实现了这种方法.

我发现我的IDE能够链接到特定的Symfony文件非常有用,我建议你使用一个,如果你已经没有.还有一个git存储库,你可以在这里找到它.