我刚刚开始学习Symfony2(我没有太多的PHP经验),所以我的问题对某些人来说可能看起来很有趣。我现在正在关注本书的Databases and Doctrine部分,我的问题涉及Fetching Related Objects示例(我使用与文档中相同的代码,因此我不会在此处粘贴所有代码)。
在此示例中,有一个代码可以获取关联的对象:
public function showAction($id)
{
$product = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product')->find($id);
$categoryName = $product->getCategory()->getName();
return array('product' => $product, 'category' => $categoryName);
}
当我在DB中设置了类别引用的Product对象上运行此控制器时,一切正常。不幸的是,当category为null时,它会抛出“FatalErrorException:Error:在非对象”上调用成员函数getName()。
我明白这是因为没有Category对象,所以没有Category名称,但我的问题是处理这种情况的最佳方法是什么?我希望$ categoryName返回null或空字符串以在我的模板中使用,就像任何其他未设置的Product对象属性一样,但由于它来自关联对象我坚持这个问题
答案 0 :(得分:1)
您可能期望:如果$product->getCategory()
没有类别,则调用$product
时,会返回空类别。
如果是这样,那就让我们编码。
构造函数应该是:
class Product
{
/**
* @var Category $category
*/
private $category; //clearly mentions that Product has ONE category
public function __construct()
{
$this->category = new Category();
//initialize this so $this->category is no longer a non-object
}
}
编辑:
你仍然会得到同样的错误,因为该教条只是将记录同步到类映射中,如
$product = new Product();
$product->setName();
...
$product->setCategory(null); // product has no category, so set null
...
对不起,我可能会骗你的。
虽然学说如上所述,但有两个解决方案的建议:
修改getter
“如果产品没有类别,则返回空类别”的其他表达式
public function getCategory()
{
if (null !== $this->category) {
return $this->category;
}
return new Category();
}
将这样一个“ifnull-then”逻辑移入树枝(正如其他人所说)
控制器中的:
public function showAction($id)
{
$product = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product')->find($id);
//$categoryName = $product->getCategory()->getName();
return array('product' => $product);
}
模板中的:
...
{{ product.category.name|default('no category') }}
...
default('no category')
可以解决问题。
在以下情况下返回“无类别”:
对我来说,我通常更喜欢2比1,因为它用较少的代码完成。
答案 1 :(得分:0)
您是否在category
内初始化了__construct
属性?
public function __construct(){
....
$this->category = new ArrayCollection();
....
}