Symfony 3:无法将类对象转换为字符串

3

我有一个地址表单。一切都按预期工作,直到我添加了一个下拉选择城市的字段。当我尝试保存表单时,我会得到以下错误:

可捕获致命错误:无法将AppBundle\Entity\Address类的对象转换为字符串

文档说,EntityType字段旨在从Doctrine实体加载选项。

这是表格:

 $builder
             ->add('cities', EntityType::class, array(
                'class' => \AppBundle\Entity\Cities::class,
                'choice_label' => 'cityname',
                'choice_value' => 'cityid')
            )

这是我的实体

 /**
 * @var string
 * 
 * @ORM\Column(name="cities", type="string", length=55, nullable=false)
 */
private $cities;   

访问器/修改器:

 /**
 * Set cities
 *
 * @param string $cities
 *
 * @return Address
 */
public function setCities($cities)
{
    $this->cities = $cities;

    return $this;
}

/**
 * Get cities
 *
 * @return string
 */
public function getCities()
{
    return $this->cities;
}

我也添加了这个:

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

产生了以下的结果:

可捕获致命错误:方法AppBundle\Entity\Address::__toString()必须返回一个字符串

2个回答

8

你应该为你的实体类实现__toString()方法:

__toString()允许一个类决定它被当作字符串处理时的行为。例如,echo $obj; 会打印出什么内容。该方法必须返回一个字符串,否则会产生致命错误E_RECOVERABLE_ERROR。

例如,你可以编写如下代码将你的类表示为一个字符串:

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

关于这个神奇的方法的更多信息,请点击这里


@DaniCalifornia 我也不喜欢这种写法:'class' => \AppBundle\Entity\Cities::class。试试这个:'class' => 'AppBundle:Cities'。 - Azuloo
同样的错误:可捕获的致命错误:方法AppBundle\Entity\Address::__toString()必须返回一个字符串值。 - Dani California
这给了我一个错误:__toString()不能抛出异常。 - Dani California
嗨。我正在使用 public function __toString() { return (string) $this->name; }public function getName() { return $this->__toString(); } 你也可以试试。 - Snegirekk
@DaniCalifornia,我很高兴你解决了这个问题:D 但是你知道吗——这并不是浪费时间,因为:1. 在这种情况下,你永远不会再犯这个错误;2. 你已经学习了AdminController,可以重写它并将其用于自己的目的。 - Azuloo
显示剩余6条评论

1
那个错误意味着你的toString方法返回的是除字符串以外的东西(可能是一个数组,根据它的名字推测)。你可以尝试检查数据以确定它是什么类型。
不过,比使用toString更好的是choice_label选项-这告诉Symfony应该将实体的哪个属性映射到标签。

但是我正在使用EntityType,并且已经设置了choice_label。 - Dani California
啊,没注意到!cityname 是否存在于您的实体中 - 我在示例中没有看到它?如果有的话,它是一个字符串吗? - Graeme Chapman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接