如何从表单类型设置实体构造函数参数?

时间:2013-05-09 09:34:14

标签: symfony symfony-2.2

我需要将一个参数传递给在Form Type中使用的Entity的构造函数。

我正在setDefaultOptions方法中的Form Type中设置实体:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyApp\MyBundle\Entity\MyEntity'
    ));
}

我想使用这样的东西:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyApp\MyBundle\Entity\MyEntity',
        'my_parameter' => 'some value'
    ));
}

以便通过构造函数注入它。

这可能吗? (我正在使用Symfony 2.2)

2 个答案:

答案 0 :(得分:9)

我认为你正在寻找这个http://symfony.com/doc/master/cookbook/form/use_empty_data.html#option-2-provide-a-closure

假设您有数据Money对象,它接受两个参数金额和货币。这是这种对象的表单类型:

<?php
class MoneyType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('amount', 'number')
            ->add('currency', 'text')
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Foo\Model\Money',
            'empty_data' => function (FormInterface $form) {
                return new Money(
                    $form->getData()['amount'],
                    $form->getData()['currency']
                );
            },
        ));
    }
}

答案 1 :(得分:2)

表单类型永远不会创建任何实体对象。因此,为实体构造函数传递参数似乎没有任何意义。

甚至不需要设置data_class选项来将表单与实体对象耦合。在大多数情况下,数据类是根据传递给表单构建器的对象猜测的。

来自Symfony docs:

  

每个表单都需要知道包含该类的类的名称   基础数据(例如Acme \ TaskBundle \ Entity \ Task)。通常,这是   只是猜测基于传递给第二个参数的对象   createForm(即$ task)。后来,当你开始嵌入表格时,这个   将不再足够。所以,虽然并非总是必要,但它是   通常最好明确指定data_class选项   (...)

修改

一个例子:

class SomeController extends Controller
{
    public function fooAction()
    {
         $entityObject = new MyEntity($someArgument);

         // now we create form:
         $form = $this->createForm(new BarFormType(), $entityObject);

         // then you can bind form:
         $form->bind($this->getRequest());

         // ... and enjoy your data :)
         printf("Hello %s", $entityObject->getValuePassedByUserViaForm());
    }
}