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
在文档中你可以找到这部分配置