Я использую библиотеку Doctrine Annotations (не всю 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 или что-то подобное, но оно устарело, поэтому я хотел бы решить проблему другим способом.






Один из способов обойти регистрацию загрузчика - это явный require_once всех файлов с пользовательскими аннотациями где-то во время начальной загрузки приложения (такой подход использовался в ODM MongoDB, но был отброшен).
В следующей основной версии annotations будет полагаться на автозагрузку, поэтому для установки не потребуется никакого кода. Чтобы иметь перспективный код, вы можете использовать:
use Doctrine\Common\Annotations\AnnotationRegistry;
if (class_exists(AnnotationRegistry::class)) {
AnnotationRegistry::registerLoader('class_exists');
}
Вы можете явно передать автозагрузчик Composer, но class_exists будет работать нормально, если автозагрузчик Composer уже используется.
Я отправил аналогичный вопрос и сам ответил на него, поскольку, по-видимому, ответ на него оказался гораздо более неясным, чем я мог себе представить, и в конечном итоге потребовался целый день, чтобы его разыскать, хотя и достаточно легко исправить:
composer require “yogarine/doctrine-annotation-autoload”
composer dump-autoload
Подробнее см. https://stackoverflow.com/a/59966965/4538469.
Верно ли, что автозагрузка без реестра будет доступна только с версии 2.0?