将实体传递给FormType,以便其方法可以在Symfony2中的buildForm()中运行

时间:2016-02-10 15:24:21

标签: php xml symfony symfony-forms

开始使用Symfony框架,到目前为止一切顺利,但以下让我感到难过。

我需要提取以前持久化的数据,以预先填充多页表单另一个阶段的某些字段。

我曾希望只是传入对象以使用它的方法,但我似乎无法让它工作。

例如:

foo.php

...

$form = $this->formFactory->create('foo_type', $article);

...

fooType.php

...

protected $article;

    public function __construct(Article $article)
    {
        $this->article = $article;
    }

 public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add(
                'fooTitle',
                'text',
                array('data' => $this->article->getTitle())
            );
    }

...

forms.xml

    <service id="footType" class="\Path\To\File\fooType">
        <argument type="service" id="article" />
        <tag name="form.type" alias="foo_type" />
    </service>

我觉得我错过了某个关键步骤,但我很难理解如何将xml与用于构建表单的类型相关联。

1 个答案:

答案 0 :(得分:1)

FormBuilder不应该操纵实体数据,因为正如其名称所示,其作用是构建Form的不同字段。

关于填充字段,实际上非常简单:如果您在实体上设置属性,将实体绑定到Form时,相关字段(即与您的属性同名的字段)将充分改变其数据。

示例:

<强> FooType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title', 'text');
}

<强> Foo.php

$article->setTitle('HELLO');
$this->formFactory->create('foo_type', $article);

然后,您的FormView会直接将title字段填充"HELLO"