Использование Doctrine Annotations для создания пользовательских аннотаций не удается

Я пытаюсь определить и использовать пользовательские аннотации, но не могу понять проблему. Основа — учение / аннотации, и это мои собственные классы:

<?php
namespace MyCompany\Annotations\Annotation;

use Doctrine\Common\Annotations\Annotation;

/**
* @Annotation
* @Target("PROPERTY")
*/
final class Type
{
/**
* @Required
*
* @var string
*/
public $name;
}

<?php
namespace MyCompany\Annotations;

use MyCompany\Annotations\Annotation as MYC;

class Person
{
/**
* @MYC\Type(name = "string")
*/
private $firstName;

/**
* @MYC\Type(name = "string")
*/
private $lastName;

public function __construct($firstName, $lastName)
{
$this->firstName = $firstName;
$this->lastName = $lastName;
}

public function getFirstName()
{
return $this->firstName;
}

public function getLastName()
{
return $this->lastName;
}
}

Теперь я хочу прочитать аннотации всех свойств:

<?php
require __DIR__ . '/../vendor/autoload.php';

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\CachedReader;
use Doctrine\Common\Cache\ArrayCache;
use MyCompany\Annotations\Person;

$refClass = new ReflectionClass(Person::class);
$props = $refClass->getProperties();

foreach ($props as $prop) {
$reader = new AnnotationReader();
$annotationReader = new CachedReader(
$reader, new ArrayCache()
);
$annotations = $annotationReader->getPropertyAnnotations(
$prop
);
print_r($annotations);
}

Если я запускаю свой тестовый скрипт, он завершается с ошибкой:

Uncaught exception 'Doctrine\Common\Annotations\AnnotationException' with message '[Semantical Error] The annotation "@MyCompany\Annotations\Annotation\Type" in property MyCompany\Annotations\Person::$firstName does not exist, or could not be auto-loaded.'

Меня смущает тот факт, что имя класса в сообщении об ошибке начинается с символа «@».

0

Решение

Вам не хватает вызова для регистрации аннотаций (как ваших, так и любых внутренних, которые вы используете). Самый простой способ сделать это — передать автозагрузчик Composer напрямую в Doctrine. registerLoader метод:

$loader = require_once 'vendor/autoload.php';
Doctrine\Common\Annotations\AnnotationRegistry::registerLoader([$loader, "loadClass"]);

в верхней части вашего тестового сценария.

Это предполагает, что вы выполняете всю свою автозагрузку через Composer, но если нет, то есть методы, доступные для регистрации отдельных файлов или пространств имен, описанные здесь в руководстве

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector