Я работаю над проектом 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. Есть идеи?
У меня была аналогичная проблема при использовании 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"