如何在代理找不到引用的文档时抑制MongoDDException

时间:2012-06-14 08:24:53

标签: doctrine-odm

我们正在使用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页并破坏我们的服务)

3 个答案:

答案 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;