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__...\BlogBundle\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();
我不确定我的做法是否正确。
此外,由于 Category
和 User
对象被传递给 category_id
和 user_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
,我只有字段id
和name
- 所以唯一的字符串表示是name
。
【讨论】:
【参考方案2】:在 symfony 3 中,你不能使用属性。
此处出现错误消息:“属性”选项不存在。 ...
这是因为实体字段不再使用“属性”选项(documentation)。
您应该改用“choice_label”选项。
【讨论】:
以上是关于symfony2 ContextErrorException:可捕获的致命错误:类 Proxies\__CG__\...\Entity\... 的对象无法转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章