1

我正在尝试使用 Doctrine Common 来创建自己的注释。http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.html与https://github.com/doctrine/common不匹配,因为Call to undefined method Doctrine\\Common\\Annotations\\AnnotationReader::setDefaultAnnotationNamespacePHP Fatal error: Call to undefined method Doctrine\\Common\\Annotations\\AnnotationRegistry::registerAnnotationNamespace. 我检查了来源,他们不在那里。根据 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);

Gets:"[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?"我很可能会这样做,但对于我的生活,我无法弄清楚在哪里添加它。如果可能的话,我真的很想使用@Foo。

4

2 回答 2

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']);

然后找到了注解。

于 2015-07-20T14:56:19.333 回答
1

自动加载显然AnnotationRegistry::registerAutoloadNamespace是由 PSR-0 自动加载器处理的。文档/来源

我发现你可以use My\Test\Foo在带注释的文件中做一个@Foo作为注释使用。其原因可能是因为 Doctrine仅针对语句重新解析文件。use

于 2012-06-13T22:48:03.193 回答