无法将实体链接到表单事件侦听器中的表单基础数据实体
Can't get entity linked to form underlying data entity in form event listener
我有三个链接的实体,例如:国家、地区和城市,其中
City 与 Region 关联,Region 与 Country 关联(多对一)。
我想为城市实体制作一个表格。这个表单应该有两个选择框(国家和地区)和城市名称的文本字段。
选择框:
- Region 是映射字段(因为它是 属性 City 实体)
- 国家是非映射字段;我通过 PRE_SET_DATA
上的表单事件侦听器添加它
问题:
当我编辑任何城市时 - 它已成功链接到地区(在选择框中选择了正确的地区)。
但是我无法在事件侦听器中将国家/地区链接到该地区。 Region::getCountry() 方法总是 return NULL。
在任何其他代码中,我可以将国家/地区链接到任何地区。但不是在事件监听器中。我用谷歌搜索了一整天,没有结果。
实体代码及其关系如下:
class Country
{
/**
* @ORM\OneToMany(targetEntity="OQ\ReferenceBundle\Entity\Region", mappedBy="country")
*/
protected $regions;
}
class Region
{
/**
* @ORM\ManyToOne(targetEntity="OQ\ReferenceBundle\Entity\Country", inversedBy="regions")
* @ORM\JoinColumn(name="country_id", referencedColumnName="id", nullable=false)
*/
protected $country;
/**
* @ORM\OneToMany(targetEntity="OQ\ReferenceBundle\Entity\City", mappedBy="region")
*/
protected $cities;
}
class City
{
/**
* @ORM\ManyToOne(targetEntity="OQ\ReferenceBundle\Entity\Region", inversedBy="cities")
* @ORM\JoinColumn(name="region_id", referencedColumnName="id", nullable=false)
*/
protected $region;
}
还有CityType形式的代码:
class CityType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
if ($event->getData() instanceof City) {
$form = $event->getForm();
$data = $event->getData();
$region = $data->getRegion(); // California
$country = $region->getCountry(); // NULL, but California is related to USA
$form->add(
'country',
'translatable_entity',
[
'mapped' => false,
'label' => 'oq.reference.country.entity_label',
'class' => 'OQReferenceBundle:Country',
'property' => 'name',
'required' => true,
'empty_value' => 'oq.reference.country.choose',
'property_path' => false,
'data' => $country
]
);
}
});
$builder
->add(
'name',
'text',
[
'required' => true,
'label' => 'oq.reference.city.name.label'
]
)->add(
'region',
'translatable_entity',
array(
'label' => 'oq.reference.region.entity_label',
'class' => 'OQReferenceBundle:Region',
'property' => 'name',
'required' => true,
'empty_value' => 'oq.reference.region.choose'
)
);
}
...
}
确切地说,此代码试图从与城市相关的区域实体中获取国家/地区:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
if ($event->getData() instanceof City) {
$form = $event->getForm();
$data = $event->getData();
$region = $data->getRegion(); // California
$country = $region->getCountry(); // NULL, but California is related to USA
...
更新
我在 中继续解决这个问题,其中代码更小,但问题更全球化
我通过删除缓存目录解决了这个奇怪的问题。
我有三个链接的实体,例如:国家、地区和城市,其中 City 与 Region 关联,Region 与 Country 关联(多对一)。
我想为城市实体制作一个表格。这个表单应该有两个选择框(国家和地区)和城市名称的文本字段。 选择框:
- Region 是映射字段(因为它是 属性 City 实体)
- 国家是非映射字段;我通过 PRE_SET_DATA 上的表单事件侦听器添加它
问题:
当我编辑任何城市时 - 它已成功链接到地区(在选择框中选择了正确的地区)。 但是我无法在事件侦听器中将国家/地区链接到该地区。 Region::getCountry() 方法总是 return NULL。 在任何其他代码中,我可以将国家/地区链接到任何地区。但不是在事件监听器中。我用谷歌搜索了一整天,没有结果。
实体代码及其关系如下:
class Country
{
/**
* @ORM\OneToMany(targetEntity="OQ\ReferenceBundle\Entity\Region", mappedBy="country")
*/
protected $regions;
}
class Region
{
/**
* @ORM\ManyToOne(targetEntity="OQ\ReferenceBundle\Entity\Country", inversedBy="regions")
* @ORM\JoinColumn(name="country_id", referencedColumnName="id", nullable=false)
*/
protected $country;
/**
* @ORM\OneToMany(targetEntity="OQ\ReferenceBundle\Entity\City", mappedBy="region")
*/
protected $cities;
}
class City
{
/**
* @ORM\ManyToOne(targetEntity="OQ\ReferenceBundle\Entity\Region", inversedBy="cities")
* @ORM\JoinColumn(name="region_id", referencedColumnName="id", nullable=false)
*/
protected $region;
}
还有CityType形式的代码:
class CityType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
if ($event->getData() instanceof City) {
$form = $event->getForm();
$data = $event->getData();
$region = $data->getRegion(); // California
$country = $region->getCountry(); // NULL, but California is related to USA
$form->add(
'country',
'translatable_entity',
[
'mapped' => false,
'label' => 'oq.reference.country.entity_label',
'class' => 'OQReferenceBundle:Country',
'property' => 'name',
'required' => true,
'empty_value' => 'oq.reference.country.choose',
'property_path' => false,
'data' => $country
]
);
}
});
$builder
->add(
'name',
'text',
[
'required' => true,
'label' => 'oq.reference.city.name.label'
]
)->add(
'region',
'translatable_entity',
array(
'label' => 'oq.reference.region.entity_label',
'class' => 'OQReferenceBundle:Region',
'property' => 'name',
'required' => true,
'empty_value' => 'oq.reference.region.choose'
)
);
}
...
}
确切地说,此代码试图从与城市相关的区域实体中获取国家/地区:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
if ($event->getData() instanceof City) {
$form = $event->getForm();
$data = $event->getData();
$region = $data->getRegion(); // California
$country = $region->getCountry(); // NULL, but California is related to USA
...
更新
我在
我通过删除缓存目录解决了这个奇怪的问题。