Sf2 Forms - $ form-> getData()返回一个数组而不是一个实例,而defaultOptions'data_class'设置

时间:2015-02-23 09:44:00

标签: forms symfony

我遇到了Symfony表格的问题。

我在formType类中指定了data_class,如下所示:

    <?php

namespace myCompany\myBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use myCompany\myBundle\Entity\someEntity;


class someType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //here my form builder. No problem there...
    }

    public function getName()
    {
        return 'aNameForTheServiceToBeCalled';
    }

    public function setDefautOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'myCompany\myBundle\Entity\someEntity',
            'empty_data' => new someEntity()
        ));
    }
}

当这个表单被声明为服务时,我从控制器这样调用它:

$form=$this->createForm('aNameForTheServiceToBeCalled');

然后在某些时候我想获取发布的表单数据,所以我这样做:

$data = $form->getData();

根据Symfony API文档:

  

public mixed getData():   以基础对象所需的格式返回数据

所以我期待$ data成为someEntity的一个实例。

但显然我错了,因为我正在尝试$ em-&gt;坚持($ data);我接到一个错误说:

  

EntityManager#persist()期望参数1是一个实体对象,给定数组。

显然$ data是一个数组,是someEntity的一个实例。 提前帮助你!

----------------------- NB。 我知道而不是打电话

$form=$this->createForm('aNameForTheServiceToBeCalled');

从我的控制器,我可以做以下事情:

$someEntity = //... new instance of someEntity, or from a repository, or whatever someEntity managerslike service
$form=$this->createForm('aNameForTheServiceToBeCalled', $someEntity);

但这正是我不想做的事情......

2 个答案:

答案 0 :(得分:2)

我有一个错字:

 public function setDefautOptions(OptionsResolverInterface $resolver)

应该是

 public function setDefau**l**tOptions(OptionsResolverInterface $resolver)

L失踪了...... 关于如何浪费2小时无所事事...... 大家好!

答案 1 :(得分:2)

很好,就是这样。 setDefaultOptions是必需的,但已弃用,因为Symfony 2.6将在支持configureOptions 中从3.0中删除。

这里有一个提示,可以让您顺利地从Symfony 2.X过渡到Symfony 3.0及以上版本:

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $this->configureOptions($resolver);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => YOUR_ENTITY_OR_MODEL_CLASS::class,
            'attr' => array(
                'id' => $this->getName()
            ),
            'custom_parameters' => [] // Set a Variable that will allow to pass custom parameters from a controller to the type
        ));
    }