3

我需要将参数传递给在表单类型中使用的实体的构造函数。

我在 setDefaultOptions 方法中从表单类型设置实体:

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)

4

2 回答 2

11

我认为您正在寻找此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']
                );
            },
        ));
    }
}
于 2013-07-24T17:03:34.550 回答
4

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

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

来自 Symfony 文档:

每个表单都需要知道保存底层数据的类的名称(例如 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());
    }
}
于 2013-05-09T11:14:48.260 回答