我需要将一个参数传递给在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)
答案 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());
}
}