Использование Doctrine Annotations для создания пользовательских аннотаций завершается неудачно - PullRequest
0 голосов
/ 08 ноября 2018

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

<?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.'

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

1 Ответ

0 голосов
/ 08 ноября 2018

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

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

вверху тестового скрипта.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...