Как включить префикс аннотации ORM вне Symfony2? - PullRequest
2 голосов
/ 23 ноября 2011

Я конвертирую старый проект PHP в фреймворк Symfony2.Некоторые страницы теперь обрабатываются моим фронт-контроллером Symfony2 (index.php), но многие страницы еще не были преобразованы.

Проблема в том, что в Symfony все мои аннотации сущностей Doctrine должны начинаться спрефикс ORM \, но за пределами Symfony, этот префикс, по-видимому, не включен, и поэтому я получаю следующую ошибку:

Class MyProject\MyBundle\Entity\MyClass is not a valid entity or mapped super class.

Я пытался продублировать любую магиюSymfony делает это, включая , следуя этим инструкциям [doctrine-project.org], и фактически полностью включает app / autoload.php в мой старый процесс начальной загрузки.Но ничего не работает.

Кто-нибудь знает, как я могу вручную скопировать все, что делает Symfony, чтобы включить префикс ORM \ для моих аннотаций Doctrine?

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

Я получил ответ от группы Google Symfony2. Проблема в том, что конфигурация Doctrine, показанная в документации, использует SimpleAnnotationReader за кулисами, но вам нужно регулярно AnnotationReader, чтобы использовать префикс пространства имен ORM\. Я получил его на работу, заменив это:

$config = new Doctrine\ORM\Configuration();
$driver = $config->newDefaultAnnotationDriver('/path/to/my/entities');

с этим:

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
// ...
$config = new Doctrine\ORM\Configuration();
$reader = new AnnotationReader();
$driver = new AnnotationDriver($reader, '/path/to/my/entities');
2 голосов
/ 18 июля 2017

Я закончил с:

Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration($paths, $devMode, null, null, false);`

3-й и 4-й null аргументы являются значениями по умолчанию. 5-й false аргумент говорит ему сделать стандартный AnnotationReader, а не основной.

Я использую Doctrine 2.5.6.

Объяснение

Я обнаружил, что не могу заставить работать решение Яна без вызова Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration, пока не сделал свою собственную конфигурацию. Я получаю эту ошибку:

'[Semantical Error] The annotation "@Doctrine\ORM\Mapping\Entity" in class My\Class does not exist, or could not be auto-loaded.'

Я был очень смущен, поэтому взглянул на исходный код.

Оказывается, createAnnotationMetadataConfiguration вызывает Doctrine\ORM\Configuration::newDefaultAnnotationDriver, а не создает драйвер аннотации напрямую. Это вызывает AnnotationRegistry::registerFile(__DIR__ . '/Mapping/Driver/DoctrineAnnotations.php');, что кажется критическим. После этого newDefaultAnnotationDriver просто создает new AnnotationDriver().

...