symfony2 Catchable Fatal Error: объект класса не может быть преобразован в строку

У меня есть этот Entity:

<?php namespace Apw\BlackbullBundle\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; /** * Categories * * @ORM\Table() * @ORM\Entity(repositoryClass="Apw\BlackbullBundle\Entity\CategoriesRepository") */ class Categories { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="categories_image", type="string", length=64, nullable = true) */ private $categoriesImage; /** * @var integer * * @ORM\Column(name="parent_id", type="integer", nullable = true, options={"default":0}) */ private $parentId; /** * @var integer * * @ORM\Column(name="sort_order", type="integer", nullable = true, options={"default":0}) */ private $sortOrder; /** * @var \DateTime * * @ORM\Column(name="date_added", type="datetime", nullable = true) */ private $dateAdded; /** * @var \DateTime * * @ORM\Column(name="last_modified", type="datetime", nullable = true) */ private $lastModified; /** * @var boolean * * @ORM\Column(name="categories_status", type="boolean", nullable = true, options={"default" = 1}) */ private $categoriesStatus; /** * @ORM\OneToMany(targetEntity="CategoriesDescription", mappedBy="category", cascade={"persist", "remove"}) */ private $categoryDescription; /** * @ORM\ManyToMany(targetEntity="Products", mappedBy="categories") **/ private $products; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set categoriesImage * * @param string $categoriesImage * @return Categories */ public function setCategoriesImage($categoriesImage) { $this->categoriesImage = $categoriesImage; return $this; } /** * Get categoriesImage * * @return string */ public function getCategoriesImage() { return $this->categoriesImage; } /** * Set parentId * * @param integer $parentId * @return Categories */ public function setParentId($parentId) { $this->parentId = $parentId; return $this; } /** * Get parentId * * @return integer */ public function getParentId() { return $this->parentId; } /** * Set sortOrder * * @param string $sortOrder * @return Categories */ public function setSortOrder($sortOrder) { $this->sortOrder = $sortOrder; return $this; } /** * Get sortOrder * * @return string */ public function getSortOrder() { return $this->sortOrder; } /** * Set dateAdded * * @param \DateTime $dateAdded * @return Categories */ public function setDateAdded($dateAdded) { $this->dateAdded = $dateAdded; return $this; } /** * Get dateAdded * * @return \DateTime */ public function getDateAdded() { return $this->dateAdded; } /** * Set lastModified * * @param \DateTime $lastModified * @return Categories */ public function setLastModified($lastModified) { $this->lastModified = $lastModified; return $this; } /** * Get lastModified * * @return \DateTime */ public function getLastModified() { return $this->lastModified; } /** * Constructor */ public function __construct() { $this->categoryDescription = new ArrayCollection(); $this->products = new ArrayCollection(); } /** * Add categoryDescription * * @param \Apw\BlackbullBundle\Entity\CategoriesDescription $categoryDescription * @return Categories */ public function addCategoryDescription(\Apw\BlackbullBundle\Entity\CategoriesDescription $categoryDescription) { $this->categoryDescription[] = $categoryDescription; return $this; } /** * Remove categoryDescription * * @param \Apw\BlackbullBundle\Entity\CategoriesDescription $categoryDescription */ public function removeCategoryDescription(\Apw\BlackbullBundle\Entity\CategoriesDescription $categoryDescription) { $this->categoryDescription->removeElement($categoryDescription); } /** * Get categoryDescription * * @return \Doctrine\Common\Collections\Collection */ public function getCategoryDescription() { return $this->categoryDescription; } /** * Add products * * @param \Apw\BlackbullBundle\Entity\Products $products * @return Categories */ public function addProduct(\Apw\BlackbullBundle\Entity\Products $products) { $this->products[] = $products; return $this; } /** * Remove products * * @param \Apw\BlackbullBundle\Entity\Products $products */ public function removeProduct(\Apw\BlackbullBundle\Entity\Products $products) { $this->products->removeElement($products); } /** * Get products * * @return \Doctrine\Common\Collections\Collection */ public function getProducts() { return $this->products; } /** * Set categoriesStatus * * @param boolean $categoriesStatus * @return Categories */ public function setCategoriesStatus($categoriesStatus) { $this->categoriesStatus = $categoriesStatus; return $this; } /** * Get categoriesStatus * * @return boolean */ public function getCategoriesStatus() { return $this->categoriesStatus; } } 

Тогда у меня есть этот метод в моем контроллере для отправки формы формы:

 <?php namespace Apw\BlackbullBundle\Controller; use Apw\BlackbullBundle\Entity\Categories; use Apw\BlackbullBundle\Entity\CategoriesDescription; use Apw\BlackbullBundle\Form\CategoriesType; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; class CategoriesController extends Controller { /** * @Security("has_role('ROLE_ADMIN')") * @Route("/createCategory") * @Template() */ public function createCategoryAction(Request $request){ $category = new Categories(); $categoryDesc = new CategoriesDescription(); $category->addCategoryDescription($categoryDesc); $categoryDesc->setCategory($category); $form = $this->createForm(new CategoriesType(), $category); $form->handleRequest($request); if($form->isValid()){ //exit(\Doctrine\Common\Util\Debug::dump($category)); $em = $this->getDoctrine()->getManager(); $em->persist($category); $em->persist($categoryDesc); $em->flush(); return $this->redirect($this->generateUrl('apw_blackbull_categories_showcategories')); } return array( 'form' => $form->createView() ); } } 

И, наконец, это моя CategoryType.php:

 <?php namespace Apw\BlackbullBundle\Form; use Doctrine\ORM\EntityRepository; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class CategoriesType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('categoryDescription', 'collection', array( 'type' => new CategoriesDescriptionType(), 'allow_add' => true, 'options' => array('data_class' => 'Apw\BlackbullBundle\Entity\CategoriesDescription'), 'by_reference' => false, )) ->add('categoriesImage', null, array('label'=>'Foto:')) ->add('categoriesStatus', null, array('label'=>'Stato:')) ->add('parentId', 'entity', array( //provare a mettere una querybuiler 'class' => 'ApwBlackbullBundle:CategoriesDescription', 'property' => 'categoriesName', 'empty_value' => 'Scegliere una categoria', 'required' => false, 'label' => 'Crea in:')) ->add('salva','submit') ->add('azzera','reset') ; } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Apw\BlackbullBundle\Entity\Categories', )); } /** * @return string */ public function getName() { return 'categories'; } } 

Когда я пытаюсь сохранить данные, я получаю эту ошибку:

Исключение произошло при выполнении «INSERT INTO Categories» (category_image, parent_id, sort_order, date_added, last_modified, categories_status) VALUES (?,?,?,?,?,?) 'С параметрами ["as", {}, null, null , null, 1]:

Catchable Fatal Error: объект класса Apw \ BlackbullBundle \ Entity \ CategoriesDescription не может быть преобразован в строку

Что я делаю неправильно?

Вам нужно реализовать __toString() в вашем Apw\BlackbullBundle\Entity\CategoriesDescription .

Вы можете сделать:

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

Для Symfony 3.x

Согласно Symfony docs v3.x, вы должны использовать свойство choice_label, чтобы указать имя поля сущности, которое будет использоваться здесь.

 ->add('categoryDescription', 'collection', array( 'type' => new CategoriesDescriptionType(), 'allow_add' => true, 'options' => array('data_class' => 'Apw\BlackbullBundle\Entity\CategoriesDescription'), 'choice_label' => 'name', 'by_reference' => false, )) 

поэтому я решил проблему, получив значение относительного родителя в методе $form->isValid()

 public function createCategoryAction(Request $request){ $category = new Categories(); $categoryDesc = new CategoriesDescription(); $category->addCategoryDescription($categoryDesc); $categoryDesc->setCategory($category); $form = $this->createForm(new CategoriesType(), $category); $form->handleRequest($request); if($form->isValid()){ //exit(\Doctrine\Common\Util\Debug::dump($parentCategory->getId())); $em = $this->getDoctrine()->getManager(); if(!$category->getParentId()){ $category->setParentId(0); }else{ // get parent id value from input choice $parent = $category->getParentId(); $parentCategory = $parent->getCategory(); // end $category->setParentId($parentCategory->getId()); } $em->persist($category); $em->persist($categoryDesc); $em->flush(); return $this->redirect($this->generateUrl('apw_blackbull_categories_showcategories')); } return array( 'form' => $form->createView() ); } 

благодаря!

Я получил ту же ошибку, но немного изменил ее, добавив:

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

Я уверен, что я получал null вместо строкового значения. (Я работал с сонатом-проектом).

Вы также можете использовать аксессуар свойства в своей форме:

 ->add('categoryDescription', 'collection', array( 'type' => new CategoriesDescriptionType(), 'allow_add' => true, 'options' => array('data_class' => 'Apw\BlackbullBundle\Entity\CategoriesDescription'), 'by_reference' => false, )) 

И добавьте 'property' => 'name' в свой КатегорииDescriptionType.

Кстати, ответ @CoachNono тоже в порядке.