Я нашел $container->registerAttributeForAutoconfiguration
вызов здесь , но, насколько я могу судить, это не добавляет классы в контейнер. Однако в документации говорится:
Альтернативный способ определить прослушиватель событий — использовать атрибут PHP AsEventListener. Это позволяет настраивать прослушиватель внутри его класса без необходимости добавлять какие-либо настройки во внешние файлы.
Я подумал, может быть, это что-то делает с ContainerConfigurator? grep -h -i eventlistener $(ag -l configurator)|grep -v '^use'
Ничего актуального не вижу.
Итак, где я могу найти код, который добавляет эти классы в контейнер?
Классы «находятся» по общей конфигурации «сервисов». В этом атрибуте нет ничего особенного для того, чтобы сделать классы доступными как сервисы в 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) какой-то вызов регистра контейнера.
В любом случае, просто добавили конкретный класс, отвечающий за поиск и загрузку этих классов.
Спасибо, foreach ($this->glob($excludePattern, true, $resource, true, true) as $path => $info)
в FileLoader
— это именно то, что я искал в поиске мудрого.
$definition->addTag('kernel.event_listener', $tagAttributes);
может быть это соответствующая строка?