Symfony 5: ожидаемый аргумент типа «string», «object», указанный в пути к свойству «MyEntity»

#php #forms #symfony

#php #формы #symfony

Вопрос:

У меня возникла проблема с классом EntityType в Symfony 5, где я не могу найти способ заставить строку формы возвращать a string вместо entity ( MyEntity ) . Это то, что я в основном имею как часть конструктора форм:

 $builder->add('myEntity', EntityType::class, [
                'class' => MyEntity::class,
                'placeholder' => "(Please select an option.)",
                'choice_label' => 'name'
            ])
 

Моя цель состоит в том, чтобы это поле возвращало значение name для MyEntity выбранного, а не для всего объекта (то есть точно такое же значение, как 'choice_label' и ). Я уже пытался добавить 'choice_value' => 'name' атрибут (с 'mapped' => false атрибутом, который, по-видимому, необходим в этом случае), но безрезультатно. Точнее, строка формы начинает возвращать null , а не a string для любого объекта.

Как я смогу достичь своей цели?

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

1. Вы настроили его как ожидающий объект — почему вы ожидаете чего-то еще? Я полагаю, что преобразователи данных могут быть тем, что вы ищете.

2. Спасибо, оказывается, что определение функции __toString() MyEntity для name поля (точно так же, как вы определили бы метод получения для name поля) исправило это, и теперь я не получаю ошибок плюс успешная отправка в БД. Дело закрыто!

Ответ №1:

Оказывается, что определение __toString() функции в MyEntity as возвращает name поле (точно так же, как вы определили getName() бы) исправило это, и теперь я не получаю ошибок плюс успешную отправку в БД.

 public function __toString() {
    return $this->name;
}
 

(Если вам интересно, почему только это добавление и ничего больше не исправляет, это потому __toString , что оно уже используется по умолчанию в каком-то ранее существовавшем коде, связанном с сущностью, для выражения сущности более простым и настраиваемым способом, если я не ошибаюсь. Теперь, когда я сделал эту функцию доступной, она собирается перейти к ней и безопасно предположить, что, когда мою сущность может потребоваться выразить в более простом формате [string], __toString ее следует вызвать для «преобразования» MyEntity в значимую строку, такую как its name . Я думаю, все это означает, что, например, вы не будете ссылаться на автомобиль по всем его внутренним частям, а скорее только по его модели.)

Ответ №2:

Я рад, что вы нашли правильное решение, но оно не сработало для меня. Я использую EntityType в его собственном типе, который вызывается в CollectionType (да, что-то особенное). Чтобы решить проблему для меня, я использовал преобразователь данных следующим образом:

 class ProductTextTransformer implements DataTransformerInterface
{

  public function reverseTransform($text)
  {
      if (null === $text) {
          return '';
      }

      return $text->getName();
  }

  public function transform($name)
  {
      // NOTE: Should not Called!
  }
}