Doctrine试图创建注释

时间:2012-06-13 10:56:07

标签: php doctrine-orm

我正在尝试使用Doctrine Common来创建自己的注释。由于Call to undefined method Doctrine\\Common\\Annotations\\AnnotationReader::setDefaultAnnotationNamespacePHP Fatal error: Call to undefined method Doctrine\\Common\\Annotations\\AnnotationRegistry::registerAnnotationNamespacehttp://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.htmlhttps://github.com/doctrine/common不符。我检查了来源,他们不在那里。根据git log,他们在一年前被删除了。

我有一台PSR-0自动装载机(来自Symfony)。所以我有一个PSR-0加载器期望的文件:

namespace My\Test;

/**
 * @Annotation
 */
class Foo {

}

另一个班级

namespace My\Annotated

/**
 * @My\Test\Foo
 */
class Test {
}

阅读器:

namespace My\Reader

use ReflectionClass;
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;
use My\Test\Foo;

$reader = new AnnotationReader();
$reflectionClass = new ReflectionClass('My\\Annotated\\Test');
$classAnnotations = $reader->getClassAnnotations($reflectionClass);
var_dump($classAnnotations);

获取:"[Semantical Error] The annotation "@My\\Test\\Foo" in class My\\Annotated\\test was never imported. Did you maybe forget to add a "use" statement for this annotation?"我ilikely做了但是对于我的生活我无法弄清楚在哪里添加它。我真的很想在可能的情况下使用@Foo。

2 个答案:

答案 0 :(得分:3)

我偶然发现错误消息,如:

Fatal error: Uncaught exception
Doctrine\Common\Annotations\AnnotationException' with message '[Semantical Error] 
The annotation "@Symfony\Component\Validator\Constraints\NotNull" in property My\Namespace\Model\Foo\Bar::$name does not exist, or could not be auto-loaded.' 
in var/www/virtual/hive/current/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php on line 54

当我试图让symfony2 Validator组件在传统的非symfony2项目中作为独立组件工作时。

我的印象也是注释应该已经自动加载,而人们必须明确地意识到必须使用教条的自动加载器才能使注释有效。

我已经看过symfony2如何加载注册表,他们在app/autoload.php

中这样做了
<?php

use Doctrine\Common\Annotations\AnnotationRegistry;
use Composer\Autoload\ClassLoader;

/**
 * @var ClassLoader $loader
 */
$loader = require __DIR__.'/../vendor/autoload.php';

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

返回$ loader;

我的项目使用的bootstrap.inc.php文件始终会被加载,并且有:

require_once PROJECT_PATH . '/vendor/autoload.php';

我只是重构它看起来很相似:

use Doctrine\Common\Annotations\AnnotationRegistry;

...

$loader = require_once PROJECT_PATH . '/vendor/autoload.php';
AnnotationRegistry::registerLoader([$loader, 'loadClass']);

然后找到了注释。

答案 1 :(得分:1)

自动加载显然由AnnotationRegistry::registerAutoloadNamespace处理,这是一个PSR-0自动加载器。 Documentation/source

我发现您可以在带注释的文件中执行use My\Test\Foo以使用@Foo作为注释。其原因可能是因为Doctrine re-parses该文件仅用于use语句。