我从这里跟着我的例子How to fill the dropdown list dynamically in symfony? (select the cities of the region)
我正在尝试创建一个嵌套的Form,在表单中嵌入一组表单 . 我有buildForm的问题 .
就我而言,我正在尝试为雇主(雇主)实体的公司(企业)实体选择该地区的城市 .
添加实体时遇到问题,在企业版的情况下也存在问题 .
When adding the Employer (Employeur) entity: (I can not display the add form)
此示例适用于某些实体(简单形式,而不是嵌套) .
但是当我用Employer实体尝试它时,我收到了这个错误:
在null上调用成员函数getVille()
堆栈跟踪:
FatalThrowableError Symfony \ Component \ Debug \ Exception \ FatalThrowableError:在GE \ CandidatBundle \ Form \ EntrepriseType-> GE \ CandidatBundle \的src \ GE \ CandidatBundle \ Form \ EntrepriseType.php:159上调用成员函数getVille()在call_user_func(对象(Closure),对象(FormEvent),'form.pre_set_data',对象(EventDispatcher))的形式(对象(FormEvent),'form.pre_set_data',对象(EventDispatcher))(vendor \ symfony \ Symfony \ src \ Symfony \ Component \ EventDispatcher \ EventDispatcher.php:212)在Symfony \ Component \ EventDispatcher \ EventDispatcher-> doDispatch(array(object(Closure)),'form.pre_set_data',object(FormEvent))(供应商\ symfony \ symfony \ src \ Symfony \ Component \ EventDispatcher \ EventDispatcher.php:44)在Symfony \ Component \ EventDispatcher \ EventDispatcher-> dispatch('form.pre_set_data',object(FormEvent))(vendor \ symfony \ symfony \ src \ Symfony \ Component \ EventDispatcher \ ImmutableEventDispatcher.php:43)在Symfony \ Component \ EventDispatcher \ ImmutableEventDispatcher-> dispatch('form.pre_set_ Symfony \ Component \ Form \ Form-> setData(null)中的data',object(FormEvent))(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Form.php:341)(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Extension \ Core \ DataMapper \ PropertyPathMapper.php:57)在Symfony \ Component \ Form \ Extension \ Core \ DataMapper \ PropertyPathMapper-> mapDataToForms(object(Employeur),object(RecursiveIteratorIterator))(供应商) \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Form.php:385)在Symfony \ Component \ Form \ Form-> setData(object(Employeur))(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Form.php:489)在Symfony \ Component \ Form-> initialize()(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ FormBuilder.php:226)在Symfony \ Component \ Form \ FormBuilder- >在Symfony \ Component \ Form \ FormFactory-> create('GE \ CandidatBundle \ Form \ EmployeurType',object(Employeur)中的getForm()(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ FormFactory.php:30) ),array())(vendor \ symfony \ symfony \ src \ Symfony \ Bundle \ FrameworkBundle \ Controller \ Controll erTrait.php:331)在Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller-> createForm('GE \ CandidatBundle \ Form \ EmployeurType',object(Employeur))(src \ GE \ CandidatBundle \ Controller \ EmployeurController.php:44)在GE \ CandidatBundle \ Controller \ EmployeurController-> newAction(object(Request))at call_user_func_array(array(object(EmployeurController),'newAction'),array(object(Request)))
雇主实体:
class Employeur extends Utilisateur
{
/**
* @ORM\OneToOne(targetEntity="GE\CandidatBundle\Entity\Entreprise", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
*/
protected $entreprise;
}
EntrepriseType:
$builder
->add('raisonSocial')
->add('region', EntityType::class, [
'label' => 'Region *',
'label_attr' => [
"class" => "smaller lighter blue",
"style" => "font-size: 21px;",
],
'placeholder' => 'Sélectionnez une region',
'class' => 'GECandidatBundle:Region',
'choice_label' => 'nom',
'multiple' => false,
'query_builder' => function (RegionRepository $repository) {
return $repository->getListeRegion();
}
])
->add('ville');
$formModifier = function (FormInterface $form, Region $region = null) {
$villes = null === $region ? array() : $region->getVilles();
$form->add('ville', EntityType::class, array(
'label' => 'Ville *',
'label_attr' => [
"class" => "smaller lighter blue",
"style" => "font-size: 21px;",
],
'placeholder' => 'Sélectionnez une ville',
'class' => 'GECandidatBundle:Ville',
'choice_label' => 'nom',
'choices' => $villes,
'multiple' => false,
'expanded' => false,
));
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
$data = $event->getData();
$formModifier($event->getForm(), $data->getVille());
}
);
$builder->get('region')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
$region = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $region);
}
);
我的问题出在这一行:
$ formModifier($ event-> getForm(),$ data-> getVille());
为什么我的例子之前运作良好,现在已经不再适用了?
When modifying the Company (Entreprise) entity: (I can not display the edit form)
类型错误:参数2传递给GE \ CandidatBundle \ Form \ EntrepriseType :: GE \ CandidatBundle \ Form ()必须是GE \ CandidatBundle \ Entity \ Region的实例或null,Proxies__CG __ \ GE \ CandidatBundle \的实例实体\ Ville给出,在第159行的C:\ xampp \ htdocs \ GestionEmploi \ src \ GE \ CandidatBundle \ Form \ EntrepriseType.php中调用
这行有问题:
$ formModifier = function(FormInterface $ form,Region $ region = null)
也许我的问题在于EmployeurType:
$builder
->add('nom')
->add('prenom')
...
->add('entreprise', EntrepriseType::class);
1 回答
在PRE_DATA-SET事件上
所以在调用$ data-> getVille()之前检查$ data!= null的代码