Проблема с импортом аннотаций

Я работаю над проектом CodeIgniter, в котором я использую Doctrine2 и компонент Symfony2 Validator.

Все мои объекты Doctrine2 use Doctrine\ORM\Mapping и диспетчер сущности распознает их. Моя аннотация объекта выглядит следующим образом:

 /** * @Entity(repositoryClass = "UserRepository") * @Table(name = "user") * @HasLifecycleCallbacks() */ 

На данный момент я могу без проблем сохранять сущности. Первая проблема возникает, когда я пытаюсь использовать компонент Symfony2 Validator. Когда я пытаюсь проверить объект User , я получаю эту ошибку:

[Семантическая ошибка] Аннотации «@Entity» в классе Entity \ User никогда не импортировались. Возможно, вы забыли добавить выражение «use» для этой аннотации?

Единственное «исправление» этой проблемы – use Doctrine\Mapping\Entity , но я должен сделать это для каждой аннотации, используемой моей сущностью (Table, Column, ManyToOne и т. Д.). Я пытаюсь понять, почему мне нужно явно use каждый класс аннотаций, а не автоматически распознаваться (не следует use Doctrine\ORM\Mapping предоставить мне доступ ко всем классам в этом пространстве имен?).

Итак, я тогда попытался use Doctrine\ORM\Mapping as ORM и предваряя все мои аннотации с помощью ORM\ . Пример: @ORM\Entity() . Валидатор Symfony2 перестает жаловаться, но теперь Doctrine2 жалуется, что Class Entity\User is not a valid entity or mapped super class. Я не знаю, почему этот метод работает для Validator, но не Doctrine2. Если я запустил консольную команду doctrine:orm:info , мой User объект не распознается.

Поскольку это приложение CodeIgniter, я автоматически загружаю библиотеки Symfony2 и Doctrine2. Мой код автозагрузки выглядит следующим образом:

 # Symfony2 ClassLoader component require_once __DIR__ . '/application/libraries/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php'; $loader = new \Symfony\Component\ClassLoader\UniversalClassLoader(); $loader->register(); $loader->registerNamespace('Symfony', __DIR__ . '/application/libraries/symfony/src'); $loader->registerNamespace('Doctrine', __DIR__ . '/application/libraries/doctrine/lib'); # Doctrine2 require_once __DIR__ . '/application/libraries/doctrine/lib/Doctrine/Common/Annotations/AnnotationRegistry.php'; use Doctrine\Common\Annotations\AnnotationRegistry; AnnotationRegistry::registerLoader(function($class) use ($loader) { $loader->loadClass($class); $classExists = class_exists($class, false); return $classExists; }); AnnotationRegistry::registerFile(__DIR__ . '/application/libraries/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php'); 

Мне все равно, должен ли я предикатировать все с ORM\ или нет, я просто хочу найти решение, с которым будут работать Symfony2 Validator и Doctrine2. Есть идеи?

Solutions Collecting From Web of "Проблема с импортом аннотаций"

У меня была аналогичная проблема при использовании Silex, Doctrine2 и Symfony-Validator.

Решение состояло в том, чтобы избежать использования SimpleAnnotationsReader и вместо этого использовать обычный AnnotationReader (посмотрите на Doctrine \ ORM \ Configuration :: newDefaultAnnotationDriver ). Затем вы можете предисловие к каждому объекту с помощью ORM\ (и, конечно же, вставлять в use Doctrine\ORM\Mapping as ORM; в каждую сущность).

Я решил эту проблему, добавив следующее в файл сущности:

 use Doctrine\ORM\Mapping as ORM; 

Итак, теперь мой файл выглядит так:

 <?php namespace Acme\CustomBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Example * * @ORM\Entity * @ORM\Table(name="example") * */ class Example { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * * @var integer */ private $id; /** * @ORM\Column(type="string", length=125) * * @var string */ private $title; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set title * * @param string $title * * @return Example */ public function setTitle($title) { $this->title = $title; return $this; } /** * Get title * * @return string */ public function gettitle() { return $this->title; } } 

Добавьте утверждения use для каждой аннотации, которую вы использовали в своих entities . например:

 use Doctrine\ORM\Mapping\Entity; use Doctrine\ORM\Mapping\Table; use Doctrine\ORM\Mapping\Id; use Doctrine\ORM\Mapping\Column; use Doctrine\ORM\Mapping\GeneratedValue; 

Но вы не можете использовать этот метод. Вы можете написать все операторы use в один файл и просто включить его в свои entities .

Если вы испытываете, и из-за этого ваши тесты терпят неудачу. Убедитесь, что у вас есть правильная автозагрузка, настроенная в настройках phpunit.

Для очень специфического сценария моя проблема заключалась в обновлении моей версии symfony, тогда как до того, как у меня был файл bootstrap.cache.php , но в новой версии это app/autoload . Я должен был изменить свой phpunit.xml конфигурации phpunit.xml и установить параметр bootstrap в этот файл bootstrap="autoload.php"