5

私たちは Symfony2/DoctrineOdm/MongoDB を使用しています。

if ($doc.referenceOne != null) { ... }

削除/失われたドキュメントを指すMongoDbRef$doc.referenceOne含まれている場合、Doctrine Proxy オブジェクトは MongoDBException を発生させます。

例外を発生させる代わりに、プロキシに null を返すように指示することは可能ですか?


詳細な説明:

私たちの文書:

class User {
    /* @MongoDB\ReferenceOne( ... ) */
    private $photo;
}

$photo にMongoDbRefが含まれているが、ドキュメントが紛失または削除された場合、

doctrineを実行if ($user.photo) { ... }すると、MongoDBException が発生します。

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

アプリケーションはその変数で null 値を処理できるため、例外を抑制したいと考えています。

(例外が 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

編集: twig テンプレートまたは 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 が無視されます。

ただし、無効な参照がデータベースに残っていることに注意してください。これは、twig テンプレートでスローされた例外のみを無視します。

于 2013-06-28T16:19:51.393 に答える