исключение 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) должна быть в состоянии определить столбец идентификатора. Что я упускаю? Есть ли другой способ сделать это?

Author: ABC, 2014-04-20

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.

 10
Author: Anil, 2014-05-10 18:30:44

В symfony 3 вы не можете использовать свойство.

Здесь сообщение об ошибке: опция "свойство" не существует....

Это потому, что поле сущности больше не использует опцию "свойство" (документация).

Вместо этого вы должны использовать опцию "choice_label".

 4
Author: Jean-Luc Barat, 2016-05-04 09:59:14