关于 symfony:Symfony2 – DoctrineMongoDBBundle – Doctrine\\\\Common\\\\Annotations\\\\AnnotationException

Symfony2 - DoctrineMongoDBBundle - Doctrine\Common\Annotations\AnnotationException

我正在尝试使用 DoctrineMongoDBBundle,但是我遇到了一个问题。

在我的 config.yml 中,我有:

1
2
3
4
5
6
7
8
9
10
doctrine_mongodb:
    connections:
        default:
            server: mongodb://localhost:27017
            options:
                connect: true
    default_database: symfony2
    document_managers:
        default:
            auto_mapping: true

我的 User.php 类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
namespace HALL\\HelloWorldBundle\\Document;
use FOS\\UserBundle\\Document\\User as BaseUser;
use Doctrine\\ODM\\MongoDB\\Mapping\\Annotations as MongoDB;

/**
 * @MongoDB\\Document
 */
class User extends BaseUser
{
    /** @MongoDB\\Id(strategy="auto") */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

当我运行命令时:

1
 php app/console doctrine:mongodb:generate:documents HALLHelloWorldBundle

我收到以下错误:

[Doctrine\\Common\\Annotations\\AnnotationException]
[Semantical Error] The annotation
"@Doctrine\\ODM\\MongoDB\\Mapping\\Annotations\\Document" in class
HALL\\HelloWorldBundle\\Document\\User does not exist, or could not be
auto-loaded.

任何想法为什么?注释清楚引用。


找到解决方案。

http://groups.google.com/group/symfony2/browse_thread/thread/0d45a6bfe4b04ee7/645f347c77bdc3e6?show_docid=645f347c77bdc3e6

在 app/autoload.php 中,我需要添加:

1
Doctrine\\ODM\\MongoDB\\Mapping\\Driver\\AnnotationDriver::registerAnnotationClasses();

啊,我希望文档能告诉我这个......


在 Jamie 的解决方案中注册注释对我不起作用。它解决了这个问题,但意味着注释对象不能从缓存中反序列化。像这样注册注释:

1
AnnotationRegistry::registerFile(__DIR__.'/../vendor/doctrine-mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Annotations/DoctrineAnnotations.php');

意味着在没有引入与缓存相关的问题的情况下解决了原始问题。


DoctrineMongoDBBundle 文档中找到的解决方案

你的 app/autoload.php 必须是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

use Doctrine\\Common\\Annotations\\AnnotationRegistry;
use Doctrine\\ODM\\MongoDB\\Mapping\\Driver\\AnnotationDriver; <-- add this line

$loader = require __DIR__.'/../vendor/autoload.php';

if (!function_exists('intl_get_error_code')) {
    require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';

    $loader->add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs');
}

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

AnnotationDriver::registerAnnotationClasses();  <-- add this line

return $loader;

您应该在引导程序上注册注释类,这可以通过两种方式完成。使用 Richard 详述的静态调用。或者...

您可以在驱动程序对象上使用 registerAnnotationClasses() 方法。这应该做完全相同的事情,但不需要路径参数(因为它应该在引导程序上设置驱动程序时已经给出)。

1
2
3
4
5
6
7
use \\Doctrine\\ODM\\MongoDB\\Configuration;

.........

$configuration = new Configuration();
$driver = $configuration->newDefaultAnnotationDriver($path_to_docs);
$driver->registerAnnotationClasses();

http://symfony.com/doc/current/bundles/DoctrineMongoDBBundle/index.html

在文档中你可以找到这部分配置