Sf2 Forms - $form->getData() returns 数组而不是实例,同时设置了 defaultOptions 'data_class'
Sf2 Forms - $form->getData() returns an array instead of an instance while defaultOptions 'data_class' setted
我遇到了 Symfony 表单的问题。
我在 formType class 中指定 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() :
returns the data in the format needed for the underlying object
所以我期望 $data 是 someEntity 的一个实例。
但显然我错了,因为我正在尝试 $em->persist($data);我收到一条错误消息:
EntityManager#persist() expects parameter 1 to be an entity object, array given.
显然 $data 是一个数组,并且是 someEntity 的一个实例。
提前感谢您的帮助!
------------------------
注意。
我知道不用打电话
$form=$this->createForm('aNameForTheServiceToBeCalled');
从我的控制器,我可以改为执行以下操作:
$someEntity = //... new instance of someEntity, or from a repository, or whatever someEntity managerslike service
$form=$this->createForm('aNameForTheServiceToBeCalled', $someEntity);
但这正是我不想做的....
我打错了:
public function setDefautOptions(OptionsResolverInterface $resolver)
应该是
public function setDefau**l**tOptions(OptionsResolverInterface $resolver)
L 不见了...
关于如何白白浪费 2 小时......
谢谢大家!
很好,就是这样。 setDefaultOptions 是必需的,但自 Symfony 2.6 起已被弃用,并在 favor of 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
));
}
我遇到了 Symfony 表单的问题。
我在 formType class 中指定 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() : returns the data in the format needed for the underlying object
所以我期望 $data 是 someEntity 的一个实例。
但显然我错了,因为我正在尝试 $em->persist($data);我收到一条错误消息:
EntityManager#persist() expects parameter 1 to be an entity object, array given.
显然 $data 是一个数组,并且是 someEntity 的一个实例。 提前感谢您的帮助!
------------------------ 注意。 我知道不用打电话
$form=$this->createForm('aNameForTheServiceToBeCalled');
从我的控制器,我可以改为执行以下操作:
$someEntity = //... new instance of someEntity, or from a repository, or whatever someEntity managerslike service
$form=$this->createForm('aNameForTheServiceToBeCalled', $someEntity);
但这正是我不想做的....
我打错了:
public function setDefautOptions(OptionsResolverInterface $resolver)
应该是
public function setDefau**l**tOptions(OptionsResolverInterface $resolver)
L 不见了... 关于如何白白浪费 2 小时...... 谢谢大家!
很好,就是这样。 setDefaultOptions 是必需的,但自 Symfony 2.6 起已被弃用,并在 favor of 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
));
}