无法将实体链接以在表单事件侦听器中形成底层数据实体

时间:2015-09-24 15:15:45

标签: forms symfony listener entity-relationship

我有三个链接的实体,例如:国家,地区和城市 城市与地区相关联,地区与国家/地区(多对一)相关联。

我想为City实体制作一个表单。此表单应具有两个选择框(国家和地区)和城市名称的文本字段。 Selectboxes:

  • 区域是映射字段(因为它是City实体的属性)
  • 国家/地区是非映射字段;我通过PRE_SET_DATA
  • 上的表单事件监听器添加它

问题:

当我编辑任何城市时 - 它已成功链接到区域(在选择框中选择了正确的区域)。 但我无法在事件监听器中将Country链接到此Region。 Region :: getCountry()方法始终返回NULL。 在任何其他代码中,我可以将Country链接到任何Region。但不是在事件监听器中。我一整天用Google搜索,没有结果。

以下是实体及其关系的代码:

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'
                )
            );
    }

    ...

}

确切地说,此代码试图从City相关的Region实体获取Country:

            $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

                    ...

更新

我继续在another question中解决此问题,其中代码较小,但问题更全局

1 个答案:

答案 0 :(得分:0)

我通过删除缓存目录来解决这个奇怪的问题。