我们正在使用Symfony2 / DoctrineOdm / MongoDB,当我们这样做时:
if ($doc.referenceOne != null) { ... }
并且$doc.referenceOne
包含指向已删除/丢失文档的 MongoDbRef ,Doctrine Proxy对象会引发MongoDBException。
可以告诉代理返回null而不是引发异常吗?
详细说明:
我们的文件:
class User {
/* @MongoDB\ReferenceOne( ... ) */
private $photo;
}
如果$ photo包含 MongoDbRef ,但文档丢失/删除,
当我们执行if ($user.photo) { ... }
doctrine时会引发MongoDBException:
The "Proxies\DocumentPhotoProxy" document with identifier "4fd8b3ef732bafab7b000000" could not be found
我们希望抑制异常,因为我们的应用程序可以处理该变量中的空值。
(我们可以简单地记录该错误,而异常传播到500页并破坏我们的服务)
答案 0 :(得分:3)
编辑2: Doctrine扩展引用完整性也可以提供帮助。它会自动使无效引用无效。您可以在GitHub存储库中找到更多信息:https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/reference_integrity.md和Symfony2集成:https://github.com/stof/StofDoctrineExtensionsBundle
编辑:我无法理解你是指你的twig模板还是php。下面你会找到一个twig的解决方案但如果你的问题是关于php为你的getter添加一个try...catch
块可能会帮助你解决问题。
我不知道您是否已找到解决方案,但万一其他人需要此解决方案我已经使用了(脏)工作:
通过在主配置文件(Twig_Template
)中定义自定义类来覆盖config.yml
类
示例:
# app/config/config.yml
base_template_class: Acme\DemoBundle\Template
并使用getAttribute
块覆盖try...catch
方法:
<?php
namespace Acme\DemoBundle;
use Doctrine\ODM\MongoDB\DocumentNotFoundException;
abstract class Template extends \Twig_Template
{
protected function getAttribute($object, $item, array $arguments = array(), $type = \Twig_TemplateInterface::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false)
{
try {
$ret = parent::getAttribute($object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck);
} catch (DocumentNotFoundException $e) {
$ret = null;
}
return $ret;
}
}
这将忽略所有DocumentNotFoundExceptions。
小心但,数据库中仍然存在无效引用。这只会忽略你的树枝模板中抛出的异常。
答案 1 :(得分:0)
仅添加&#34;排序&#34;
而不是
/**
* @ODM\ReferenceMany(targetDocument="Extra", simple=true)
*/
private $extras;
使用
/**
* @ODM\ReferenceMany(targetDocument="Extra", simple=true, sort={"name"="asc"})
*/
private $extras;
答案 2 :(得分:0)
你应该添加这个注释&#34; mappedBy&#34;在您的文件中
/**
* @ODM\ReferenceMany(targetDocument="Extra", mappedBy="....")
*/
private $extras;