我正在将一个旧的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 \前缀所做的一切?
答案 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()
。