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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
574
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

use Doctrine\Common\Annotations\AnnotationRegistry;

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

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

Верно ли, что автозагрузка без реестра будет доступна только с версии 2.0?

DevilishSkull 06.01.2019 16:34

Я отправил аналогичный вопрос и сам ответил на него, поскольку, по-видимому, ответ на него оказался гораздо более неясным, чем я мог себе представить, и в конечном итоге потребовался целый день, чтобы его разыскать, хотя и достаточно легко исправить:

composer require “yogarine/doctrine-annotation-autoload”
composer dump-autoload

Подробнее см. https://stackoverflow.com/a/59966965/4538469.

Другие вопросы по теме