все сводится к магии автозагрузки.Магия автозагрузки предполагает определенную структуру каталогов, которая (среди прочего) определена в composer.json.В сущности, это говорит:
пространство имен AppBundle\...
находится в каталоге src/AppBundle/...
, и поэтому каждый класс AppBundle\Something\Else
теперь находится в src/AppBundle/Something/Else.php
, теперь symfony начинаетзагрузить службу, которая должна обрабатывать событие (из-за вашей конфигурации) AppBundle\Event\MaintenanceListener
, которое оно пытается создать, что приводит к автоматической загрузке файла src/AppBundle/Event/MaintenanceListener.php
, который содержит только класс MListener/MListener
.
Так как автозагрузка немного хакерская, обычно она пробует другие подходы / определения и, возможно, снова пытается прочитать этот файл, а затем не может повторно объявить класс MListener/MListener
, так какуже существует.
Просто чтобы прояснить это: эти подходы работают очень хорошо, если соблюдаются стандарты (в частности, PSR-4 в этом случае), которые связывают структуру каталогов со структурой пространства имен.Если вы поместите в файл что-то, что - согласно PSR-4 - там не будет, у вас будут проблемы, как у вас.
Исправление легко и очевидно: пространство имен - это каталог(с обратной косой чертой вместо любого разделителя каталогов, который есть в вашей ОС), имя файла - это имя класса (без .php, очевидно).Поэтому либо переименуйте файл в src/MListener/MListener.php
и соответственно измените services.yaml: MListener\Mlistener: ...
или переименуйте пространство имен и класс в этом файле в AppBundle\Event
и MaintenanceListener
соответственно.