Как Symfony находит классы AsEventListener?

Я нашел $container->registerAttributeForAutoconfiguration вызов здесь , но, насколько я могу судить, это не добавляет классы в контейнер. Однако в документации говорится:

Альтернативный способ определить прослушиватель событий — использовать атрибут PHP AsEventListener. Это позволяет настраивать прослушиватель внутри его класса без необходимости добавлять какие-либо настройки во внешние файлы.

Я подумал, может быть, это что-то делает с ContainerConfigurator? grep -h -i eventlistener $(ag -l configurator)|grep -v '^use' Ничего актуального не вижу.

Итак, где я могу найти код, который добавляет эти классы в контейнер?

$definition->addTag('kernel.event_listener', $tagAttributes); может быть это соответствующая строка?
Nico Haase 17.04.2024 08:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Классы «находятся» по общей конфигурации «сервисов». В этом атрибуте нет ничего особенного для того, чтобы сделать классы доступными как сервисы в Symfony.

Например, при установке Symfony по умолчанию:

# config/services.yaml
services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'

Это говорит Symfony искать все под src, за исключением трех перечисленных исключений.

За поиск и загрузку этих файлов отвечает класс Symfony\Component\DependencyInjection\Loader\FileLoader. Проверьте методы findClasses и registerClasses.

Код, который вы нашли на FrameworkExtension, сообщает Symfony, что делать каждый раз, когда обнаруживается класс, отмеченный атрибутом #[AsEventListener]: пометить его тегом kernel.event_listener (если только тег не использовался в методе, и в этом случае он выдает исключение).

Позже, в RegisterListenersPass, сервисы, которые ранее были помечены как kernel.event_listener (с помощью этого атрибута или каким-либо другим способом), регистрируются как прослушиватели событий.

«Это говорит Symfony искать все в src, за исключением трех перечисленных исключений». -- какой класс смотрит и как? Чтобы быть более конкретным, я ищу 1) какой-то итератор 2) какой-то вызов регистра контейнера.

chx 17.04.2024 12:09

В любом случае, просто добавили конкретный класс, отвечающий за поиск и загрузку этих классов.

yivi 17.04.2024 12:35

Спасибо, foreach ($this->glob($excludePattern, true, $resource, true, true) as $path => $info) в FileLoader — это именно то, что я искал в поиске мудрого.

chx 17.04.2024 15:02

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