如何在Symfony2之外启用ORM注释前缀?

时间:2011-11-23 00:57:32

标签: php doctrine annotations symfony

我正在将一个旧的PHP项目转换为Symfony2框架。有些页面现在由我的Symfony2前端控制器(index.php)处理,但许多页面尚未转换。

问题在于,在Symfony中,我的所有Doctrine实体注释都必须以ORM \前缀开头,但在Symfony之外,该前缀似乎没有启用,因此我收到以下错误:

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

我试图复制Symfony所做的任何设置,包括following these instructions [doctrine-project.org],并且实际上将app / autoload.php完全包含在我的遗留引导过程中。但没有任何作用。

有谁知道如何手动复制Symfony为我的Doctrine注释启用ORM \前缀所做的一切?

2 个答案:

答案 0 :(得分:5)

我从Symfony2 Google小组得到了答案。问题是文档中显示的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');

答案 1 :(得分:2)

我最终得到了:

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

第3个和第4个null参数是默认的。第五个false参数告诉它制作标准AnnotationReader而不是基本的。{/ p>

我正在使用Doctrine 2.5.6

<强>解释

我发现在制作自己的配置之前,我无法在不调用Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration的情况下使用Ian的解决方案。我收到了这个错误:

'[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()