我正在尝试使用Doctrine Common来创建自己的注释。由于Call to undefined method Doctrine\\Common\\Annotations\\AnnotationReader::setDefaultAnnotationNamespace
和PHP Fatal error: Call to undefined method Doctrine\\Common\\Annotations\\AnnotationRegistry::registerAnnotationNamespace
,http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/annotations.html与https://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。
答案 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
语句。