5

我们正在使用 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) { ... }学说时会引发 MongoDBException:

The "Proxies\DocumentPhotoProxy" document with identifier "4fd8b3ef732bafab7b000000" could not be found

我们希望抑制异常,因为我们的应用程序可以处理该变量中的空值。

(我们可以简单地记录该错误,而异常传播到 500 页并中断我们的服务)

4

3 回答 3

3

编辑 2: Doctrine 扩展参考完整性也可以提供帮助。它会自动取消无效的引用。您可以在他们的 GitHub 存储库中找到更多信息:https ://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/reference_integrity.md和 Symfony2 集成:https ://github.com/stof/StofDoctrineExtensionsBundle

编辑:我不明白你指的是树枝模板还是 php。您将在下面找到 twig 的解决方案,但如果您的问题是关于 php try...catch,为您的 getter 添加块可能会帮助您解决问题。

我不知道你是否已经找到了解决方案,但如果其他人需要这个,我使用了一个(肮脏的)解决方法:

通过在主配置文件 ( )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。

不过要小心,无效的引用仍然存在于您的数据库中。这只会忽略在你的树枝模板中抛出的异常。

于 2013-06-28T16:19:51.393 回答
0

只添加“排序”

代替

/**
 * @ODM\ReferenceMany(targetDocument="Extra", simple=true)
 */
private $extras;

采用

/**
 * @ODM\ReferenceMany(targetDocument="Extra", simple=true, sort={"name"="asc"})
 */
private $extras;
于 2014-10-01T15:25:02.137 回答
0

您应该在文档中添加此注释“mappedBy”

/**
 * @ODM\ReferenceMany(targetDocument="Extra", mappedBy="....")
 */
private $extras;
于 2016-03-31T13:35:44.030 回答