【问题标题】:Symfony2 - DoctrineMongoDBBundle - Doctrine\Common\Annotations\AnnotationExceptionSymfony2 - DoctrineMongoDBBundle - Doctrine\Common\Annotations\AnnotationException
【发布时间】:2011-10-06 05:34:48
【问题描述】:

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

在我的 config.yml 中,我有:

doctrine_mongodb:
    connections:
        default:
            server: mongodb://localhost:27017
            options:
                connect: true
    default_database: symfony2
    document_managers:
        default:
            auto_mapping: true

我的 User.php 类:

<?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
    }
}

当我运行命令时:

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

我收到以下错误:

[Doctrine\Common\Annotations\AnnotationException]
[语义错误] 注释 类中的“@Doctrine\ODM\MongoDB\Mapping\Annotations\Document” HALL\HelloWorldBundle\Document\User 不存在,或不能存在 自动加载。

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

【问题讨论】:

    标签: symfony doctrine-orm doctrine doctrine-odm


    【解决方案1】:

    找到解决方案。

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

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

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

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

    【讨论】:

    • 然后编辑文档并提出拉取请求(并拯救世界);-)
    【解决方案2】:

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

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

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

    【讨论】:

    • 最后我使用了require_once __DIR__.'/../vendor/doctrine-mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Annotations/DoctrineAnnotations.php'; Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver::registerAnnotationClasses(); 但是,你的似乎是一个更好的解决方案!接受你的回答。
    【解决方案3】:

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

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

    use \Doctrine\ODM\MongoDB\Configuration;
    
    .........
    
    $configuration = new Configuration();
    $driver = $configuration->newDefaultAnnotationDriver($path_to_docs);
    $driver->registerAnnotationClasses();
    

    【讨论】:

      【解决方案4】:

      Documentation of DoctrineMongoDBBundle找到解决方案

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

      <?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;
      

      【讨论】:

        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 2013-09-26
          • 1970-01-01
          • 2018-03-21
          • 1970-01-01
          • 2014-11-03
          • 2015-08-07
          • 1970-01-01
          • 1970-01-01
          • 2015-07-22
          相关资源
          最近更新 更多