Как автоматически загружать пользовательские классы аннотаций без использования AnnotationRegistry? - PullRequest
0 голосов
/ 05 января 2019

Я использую библиотеку аннотаций Doctrine (не вся Doctrine, только аннотации) и хочу создать собственный класс аннотаций.

composer.json:

{
  "require": {
    "doctrine/annotations": "^1.6"
  },
  "autoload": {
    "psr-4": {
      "annotations\\": "annotations",
      "entities\\": "entities"
    }
  }
}

index.php:

<?php

require 'vendor/autoload.php';

use Doctrine\Common\Annotations\AnnotationReader;

$annotationReader = new AnnotationReader();
$reflectionClass = new ReflectionClass(entities\MyClass::class);
$classAnnotations = $annotationReader->getClassAnnotations($reflectionClass);
var_dump($classAnnotations);

лица / MyClass.php

<?php

namespace entities;

use annotations\TestAnnotation;

/**
 * @TestAnnotation("123")
 */
class MyClass
{

}

аннотации / TestAnnotation.php

<?php

namespace annotations;

/**
 * @Annotation
 * @Target("CLASS")
 */
final class TestAnnotation
{
    /**
     * @var string
     */
    public $value;
}

Это дает мне следующую ошибку:

[Semantical Error] The annotation "@annotations\TestAnnotation" in class entities\MyClass does not exist, or could not be auto-loaded.

Единственное решение, которое я нашел в Интернете, - это использовать AnnotationRegistry :: registerLoader или что-то подобное, но оно устарело, поэтому я хотел бы решить проблему другим способом.

1 Ответ

0 голосов
/ 06 января 2019

Одним из способов обхода регистрации загрузчика является явное require_once всех файлов с пользовательскими аннотациями где-то во время начальной загрузки приложения (такой подход использовался в ODM MongoDB, но был отброшен).

В следующей основной версии annotations будет зависеть от автозагрузки, поэтому для установки не потребуется никакого кода. Чтобы иметь код на будущее, вы можете использовать:

use Doctrine\Common\Annotations\AnnotationRegistry;

if (class_exists(AnnotationRegistry::class)) {
    AnnotationRegistry::registerLoader('class_exists');
}

Вы можете явно передать автозагрузчик Composer, но class_exists будет работать нормально, если автозагрузчик Composer уже используется.

...