symfony2 ContextErrorException:可捕获的致命错误:类 Proxies\__CG__\...\Entity\... 的对象无法转换为字符串

Posted

技术标签:

【中文标题】symfony2 ContextErrorException:可捕获的致命错误:类 Proxies\\__CG__\\...\\Entity\\... 的对象无法转换为字符串【英文标题】:symfony2 ContextErrorException: Catchable Fatal Error: Object of class Proxies\__CG__\...\Entity\... could not be converted to stringsymfony2 ContextErrorException:可捕获的致命错误:类 Proxies\__CG__\...\Entity\... 的对象无法转换为字符串 【发布时间】:2014-06-04 21:07:12 【问题描述】:

我遇到了一些奇怪的事情:

我通过app/console doctrine:generate:entity创建了三个学说实体:

类别 用户 发布

我设置了关系,并且所有设备数据都可以正常工作 (app/console doctrine:fixtures:load)。

一篇文章属于一个类别 (category_id),并且有一个作者 (user_id)。

我使用 app/console doctrine:generate:crud 为我的所有实体获取 CRUD 操作。

当我更新帖子时,我收到了这个奇怪的错误:

ContextErrorException: Catchable Fatal Error: Object of class Proxies__CG__...\BlogBu​​ndle\Entity\Category 无法转换为字符串

为了正确显示我在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();

我不确定我的做法是否正确。

此外,由于 CategoryUser 对象被传递给 category_iduser_id 字段,Doctrine(或 Symfony)应该能够找出 id 列。我错过了什么?还有其他方法吗?

【问题讨论】:

它应该可以工作,你有实体类中该字段的公共getter函数吗? 是的,所有实体 getter 在两个类中都是公共的。 从你所说的一切来看,我看不出任何错误。 没有__toString() 是行不通的。如果我需要 __toString()return (string) $this->getName(); 怎么办?在那种情况下我会怎么做?您将如何处理? 您在PostType 中使用了categoryId,但该字段名为category_id。也许这是问题的原因。我个人更喜欢在命名字段时忽略_id,因为这些字段返回实体而不是id。例如 $postType->getCategory() 返回一个 Category 对象,而不仅仅是一个 id。 【参考方案1】:

我刚刚遇到了上述错误的问题(并在这里结束),我将发布对我有用的解决方案 - 因为没有其他答案。

和 OP 一样,我也创建了一个新表并使用 Doctrine 进行连接。

这个错误告诉我们加入的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,我只有字段idname - 所以唯一的字符串表示是name

【讨论】:

【参考方案2】:

在 symfony 3 中,你不能使用属性。

此处出现错误消息:“属性”选项不存在。 ...

这是因为实体字段不再使用“属性”选项(documentation)。

您应该改用“choice_label”选项。

【讨论】:

以上是关于symfony2 ContextErrorException:可捕获的致命错误:类 Proxies\__CG__\...\Entity\... 的对象无法转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 无法连接到 sqlite

找不到 Symfony2 组件类

Symfony2 - 访问被拒绝

Symfony2 / SonataUserBundle - 注册后自动登录

Symfony2 OneToMany 关系

Symfony2无效形式没有错误