stepan_sib
@stepan_sib
head, hands, hard working, contracts

Symfony: Как получить связанную сущность в слушателе формы?

Итак, есть три сущности: Страна, Регион, Город
Город связан с регионом, Регион со страной (многие к одному)

Создаю класс формы для сущности Город: будут 2 селекта (Страна и Регион) и текстовое поле для названия Города.
Селекты:
- Регион - это mapped поле для параметра сущности Город
- Страна - non-mapped поле, дабвляется в форму с помощью Event Listener'а

Проблема:
Когда я редактирую/создаю Город - все в порядке, он успешно привязывается к выбранному региону и впоследствии, при повторном редактировании Города - регион выбран в селектбоксе.
Но я никак не могу получить Страну по Региону (хотя регион привязан к стране). Т.е., я дергаю Region:getCountry() в листенере - и он всегда 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;
    }


А вот листинг класса формы:

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
                        
                        ...
  • Вопрос задан
  • 602 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы