Тип выбора не соответствует полю сущности

#php #symfony #symfony-forms

#php #symfony #symfony-forms

Вопрос:

У меня есть объект объявления, к которому привязана EditAnnouncementType форма. У меня есть две другие CheckBoxType формы, которые автоматически обновляют свои соответствующие поля, но ChoiceType форма не работает.

 $builder
        ->add('edit', SubmitType::class,
            array
            (
                'label' => 'Save changes',
                'attr' => ['class' => 'btn btn-primary']

            ))

        ->add('type', ChoiceType::class,
            [
                'choices' => [
                    'info_type' => 1,
                    'star_type' => 2,
                    'alert_type' => 3,
                    'lightbulb_type' => 3,
                    'event_type' => 4,
                    'statement_type' => 5,
                    'cat_type' => 6,
                    'hands_type' => 7
                ],

                'mapped' => true,
                'expanded' => true,
                'required' => true,
            ])
  

Объект объявления и поле типа

 class Announcement
{
    /**
     * @var int
     */
     private $type;

     /**
     * @return string
     */
     public function getType(): string
     {
        return $this->type;
     }

    /**
    * @param int $type
    *
    * @return $this
    */
    public function setType(int $type)
    {
        $this->type = $type;
        return $this;
    }
  

Ответ №1:

Я подозреваю, что Symfony каким-то образом строго проверяет значение (используя === ).
И поскольку ваш метод получения возвращает string , сопоставление не выполняется должным образом.

Вам следует попробовать исправить свой геттер:

  /**
  * @return int
  */
 public function getType(): int
 {
    return $this->type;
 }
  

Также имейте в виду, что у вас может возникнуть проблема в вашем массиве выбора:

 // be careful: those two have the same value
'alert_type' => 3, 
'lightbulb_type' => 3,
  

Это, несомненно, вызвало бы проблему для Symfony, особенно если он использует array_values для того, чтобы выбрать правильный выбор из значения вашей сущности.

Комментарии:

1. исправлено, что средство получения возвращало значение int, но все еще не работает

2. Также: что насчет дублированного значения 3? (см. Отредактированный ответ)

3. принимая этот ответ, хотя я не смог точно воспроизвести, почему он начал работать. где-то между публикацией этого вопроса и сейчас я изменил mapped на false . изменение его обратно на true исправлено. Возвращаемая строка не имела значения