【问题标题】:Create a form as a service in Symfony2在 Symfony2 中创建表单即服务
【发布时间】:2011-12-27 18:37:01
【问题描述】:

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

$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 设置为服务,我无法在其中获得正确的组件,我不知道去哪里找。

【问题讨论】:

  • 您遇到的具体问题是什么? “无法在其中获得正确的组件”是什么意思?现在它应该可以按预期工作了。
  • 现在,在我的 RegistrationManager 服务中,我需要能够调用 createForm(new RegistrationType()) 并将其返回以便控制器能够将其传递给模板,但我不确定 createForm() 的位置已定义以及如何使其在此服务类中可用。在 Symfony Forms 文档中,它的访问方式类似于 $this-&gt;createForm(),但我将如何在我的服务类中做到这一点?我不认为这是FormFactoryInterfacesymfony.com/doc/current/book/forms.html#creating-form-classes的一部分
  • FOSUserBundle直接使用form.factory服务,不需要RegisterManager类,看看github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/…
  • 查看这篇文章,它准确地解释了如何将您的表单注册为服务。 webtipblog.com/define-a-symfony-2-form-as-a-service

标签: php symfony


【解决方案1】:

你似乎快到了。要从您的服务中获取 Form 对象,您应该使用 FormFactoryInterface::create() 而不是 FormFactoryInterface::createBuilder()

$this-&gt;createForm() 在控制器中起作用的原因是因为每个控制器都在扩展 base controller,而恰好实现了这个方法。

我发现我的 IDE 能够链接到特定的 Symfony 文件非常有用,如果你还没有的话,我建议你使用它。还有一个 git 仓库,你可以找到 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多