исключение symfony2 ContextErrorException: Обнаруживаемая фатальная ошибка: Объект класса Прокси CG...Сущность… не удалось преобразовать в строку
Я столкнулся с чем-то странным:
Я создал три сущности доктрины с помощью app/console doctrine:generate:entity
:
- Категория
- Пользователь
- Сообщение
Я настроил отношения, и все отлично работает с данными приборов (app/console doctrine:fixtures:load
).
Сообщение относится к одной категории (идентификатор категории) и имеет одного автора (идентификатор пользователя).
Я использовал app/console doctrine:generate:crud
для получения операций CRUD для всех моих сущностей.
Когда я обновляю сообщение, я получаю это странное ошибка:
Исключение Contexterrorexception: Обнаруживаемая фатальная ошибка: Объект прокси класса__CG__...\BlogBundle\Сущность\Категория не удалось преобразовать в строку
Для правильного отображения раскрывающихся полей, которые я использую в PostType()
:
$builder ....
->add('categoryId','entity', array(
'class' => 'HotelBlogBundle:Category',
'property'=>'name'
))
->add('userId','entity',array(
'class'=>'UserBundle:User',
'property'=>'username'
))
Поскольку я указываю опцию property
, мне не нужен __toString()
в моих классах сущностей.
Если я создам __toString()
подобным образом (как в категориях, так и в пользовательских сущностях), ошибка исчезнет и будет работать:
public function __toString()
{
return (string) $this->getId();
}
Я не уверен, что я делайте это правильно.
Кроме того, поскольку Category
& User
объект передается в поля category_id
и user_id
, Доктрина (или Symfony) должна быть в состоянии определить столбец идентификатора. Что я упускаю? Есть ли другой способ сделать это?
2 answers
Я только что столкнулся с этой проблемой с упомянутой ошибкой (и оказался здесь), я опубликую решение, которое сработало для меня, поскольку других ответов нет.
Как и в ОП, я также создал новую таблицу и присоединился, используя доктрину.
Эта ошибка говорит нам о том, что объединенный object
не может быть преобразован в string
. Мы должны либо предоставить метод __toString()
в объекте, чтобы его можно было преобразовать в строку, либо мы можем указать, какое поле мы хотим вернуть в нашем конструкторе форм с помощью клавиши property
.
Добавьте метод __toString()
к своему объекту
/**
* (Add this method into your class)
*
* @return string String representation of this class
*/
public function __toString()
{
return $this->name;
}
ИЛИ добавьте ключ свойства в свой конструктор форм
// where `name` equals your field name you want returned
$builder->add('category', null, ['property' => 'name'])
Я просто добавил метод __toString()
в свой entity
, у меня есть только поля id
и name
, поэтому единственным строковым представлением является name
.
В symfony 3 вы не можете использовать свойство.
Здесь сообщение об ошибке: опция "свойство" не существует....
Это потому, что поле сущности больше не использует опцию "свойство" (документация).
Вместо этого вы должны использовать опцию "choice_label".