Php 在Symfony2中创建表单作为服务

Php 在Symfony2中创建表单作为服务,php,symfony,Php,Symfony,我希望能够从任何控制器执行以下操作: $register = $this->get('register_manager'); return $this->render( 'AcmeUserBundle:Account:register.html.twig', array( 'form' => $register->getRegistrationForm(), ) ); 在我的模板中 <form>

我希望能够从任何控制器执行以下操作:

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

<form>
    {{ form_widget(form) }}
</form>
RegisterManager.php
中,我有

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

services:
    register_manager:
        class:     %register_manager.class%
        arguments: [@form.factory]
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()
的工作原理与我在控制器中的工作原理相同。我的问题是如何将注册管理器设置为一项服务,我无法在其中找到正确的组件,也不知道应该在哪里查找。

您似乎就快到了。要从服务中获取表单对象,应使用而不是
FormFactoryInterface::createBuilder()

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


我发现我的IDE能够链接到特定的Symfony文件非常有用,如果您还没有这样做,我建议您使用一个。还有一个git存储库,您可以找到。

您到底遇到了什么问题?你所说的“不能在那里得到正确的组件”是什么意思?现在,它应该可以按预期工作。现在,在我的RegistrationManager服务中,我需要能够调用
createForm(new RegistrationType())
并返回该值,以便控制器能够将其传递到模板,但我不确定
createForm()
是在哪里定义的,以及如何使其在该服务类中可用。在Symfony表单文档中,它的访问方式类似于
$this->createForm()
,但在我的服务类中,我该如何访问它呢?我不认为它是
FormFactoryInterface
的一部分,FOSUserBundle直接使用form.factory服务而不需要RegisterManager类,请查看,查看这篇文章,它准确地解释了如何将表单注册为服务。