Symfony2 - DoctrineMongoDBBundle - Doctrine \ Common \ Annotations \ AnnotationException - PullRequest
8 голосов
/ 15 июля 2011

Я пытаюсь использовать DoctrineMongoDBBundle, однако у меня возникла проблема.

В моем config.yml у меня есть:

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

My 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 не существует или не может быть загружена автоматически.

Есть идеи, почему?На аннотацию четко ссылаются.

Ответы [ 5 ]

9 голосов
/ 15 июля 2011

Решение найдено.

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

в app / autoload.php, мне нужно было добавить:

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

Ах, я бы хотел, чтобы документация говорила мне об этом ...

4 голосов
/ 17 июля 2011

Регистрация аннотаций, как в решении Джейми, у меня не сработала. Это решило эту проблему, но означало, что объект аннотации не может быть не сериализован из кэша. Регистрация аннотации, как это:

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

Это означает, что исходная проблема была решена без введения проблемы, связанной с кешем.

1 голос
/ 04 декабря 2013

Решение найдено в Документация DoctrineMongoDBBundle

Ваше приложение / 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;
1 голос
/ 08 марта 2012

Вы должны зарегистрировать классы аннотаций на начальной загрузке, это можно сделать двумя способами.Использование статического вызова, как описано Ричардом.Или ...

Вы можете использовать метод registerAnnotationClasses () в вашем объекте драйвера.Это должно делать то же самое, но не требует параметра пути (как это уже должно было быть указано при настройке драйвера при начальной загрузке).

use \Doctrine\ODM\MongoDB\Configuration;

.........

$configuration = new Configuration();
$driver = $configuration->newDefaultAnnotationDriver($path_to_docs);
$driver->registerAnnotationClasses();
0 голосов
/ 04 августа 2015

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

В документе вы можете найти эту часть конфигурации

...