#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!
}
}