【问题标题】:symfony2 Catchable Fatal Error: Object of class could not be converted to stringsymfony2 可捕获的致命错误:类的对象无法转换为字符串
【发布时间】:2015-02-25 02:27:25
【问题描述】:

我已经定义了这个实体:

<?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”时发生异常 (categories_image, parent_id, sort_order, date_added, last_modified, categories_status) VALUES (?, ?, ?, ?, ?, ?)' with params ["as", {}, 空,空,空,1]:

可捕获的致命错误:类的对象 Apw\BlackbullBundle\Entity\CategoriesDescription 不能是 转成字符串

我做错了什么?

【问题讨论】:

    标签: php symfony entity


    【解决方案1】:

    您需要在您的Apw\BlackbullBundle\Entity\CategoriesDescription 中实现__toString() 方法。

    你可以这样做:

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

    【讨论】:

    • 嗨 CoachNono 我试过你的代码,但 parentId 的值很糟糕: object(stdClass)#620 (10) { ["CLASS"]=> string(37 ) "Apw\BlackbullBundle\Entity\Categories" ["id"]=> NULL ["categoriesImage"]=> string(6) "hp.jpg" ["parentId"]=> object(stdClass)#765 (5) { ["CLASS"]=> 字符串(48) "Apw\BlackbullBundle\Entity\CategoriesDescription" ["id"]=> int(36) ["categoriesName"]=> 字符串(17) "个人计算机" ["category"]=> string(52) "Proxies__CG__\Apw\BlackbullBundle\Entity\Categories" ["languages"]=> NULL } ["sortOrder"]=> NULL ["dateAdded"]=> NULL ["lastModified"]=> NULL ["categoriesStat...
    • 这对我有用,但是当我编辑一个预先填写所有数据的表单时,下拉菜单默认情况下不显示保存的选项?我怎样才能做到这一点
    • 一般情况下应该的,发个新问题链接到这里,我看看
    • @CoachNono 也解决了我的问题!谢谢 :) Symfony 3.1
    • 这个解决方案解决了我使用 Doctrine 的 CRUD 自动生成视图的问题,尤其是 Symfony 3.2.5 中的 Edit_View
    【解决方案2】:

    对于 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,
    
            ))
    

    【讨论】:

    • 太奇怪了,我有一个项目运行了至少 6 个月,突然,这个错误开始出现,choice_label 属性解决了生产服务器上的问题,虽然实体有魔法 toString方法。
    【解决方案3】:

    我遇到了同样的错误,但我通过添加以下内容进行了一些调整:

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

    我确定我得到的是 null 而不是字符串值。 (我正在使用奏鸣曲项目)。

    【讨论】:

    • 谢谢,我在使用 EasyAdmin 时遇到了类似的错误,它需要 toString 才能将选择输入生成到表单中。
    【解决方案4】:

    所以我通过在方法$form-&gt;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()
            );
        }
    

    谢谢!

    【讨论】:

    • 你是怎么想到这个的?我在控制器上遇到了类似的问题,并且嵌套了一对多的关系,当表中有一些行时它会被破坏(当数据库为空时工作正常)。所以我猜我的问题和你的类似(它是通过创建__toString 来解决的,但这对我来说就像一个黑客攻击)。了解您如何获得该解决方案将帮助我解决我的问题!
    【解决方案5】:

    您还可以在表单中使用 property 访问器:

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

    并在您的 CategoriesDescriptionType 中添加'property' =&gt; 'name'

    顺便说一句,@CoachNono 的回答也不错。

    【讨论】:

    • hi Smashou 我试过你的代码,错误是:集合输入类型中不存在选项“属性”。
    • 我的错,该属性必须在您的 CategoriesDescriptionType 中
    • 如果我应用方法 __toString() 不会分配其 parentId 的值
    猜你喜欢
    • 1970-01-01
    • 2013-10-08
    • 2015-03-08
    • 2013-08-07
    • 2014-06-04
    • 2015-08-28
    • 2018-03-12
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多