Symfony ServiceCircularReferenceException. Что делать?
Проект только начал, на 99% состоит из кода, сгенерированого командой "composer create-project symfony/framework-standard-edition my_project_name". Несколько дней назад бросил разработку, были другие дела, сейчас вернулся и с удивлением обнаружил, что он перестал запускаться (доступ к коду только у меня, никто другой влезть не мог).
Выбрасывает такую ошибку:
Circular reference detected for service "AppBundle\Exception\HttpException\ValidationHttpException", path: "AppBundle\Exception\HttpException\ValidationHttpException -> AppBundle\Exception\HttpException\ValidationHttpException".
Проблема в том, что такого сервиса нет, и никогда не было. Это тупо обычный эксепшн, выбрасывается один раз в контроллере, инстанс которого даже не создается (ошибка выбрасывается раньше). Поиск по коду тоже результатов не выдал. Пробовал из yml конфигов убрать все, кроме дефолта - тоже не помогло.
Если этот класс удалить - то ошибка пропадает и все снова работает. Но блин, он мне нужен, да и вообхе хочется разобраться откуда эта хрень происходит. Никто не сталкивался? Что это может быть?
Возможно, но как это понять и исправить, если даже сброс до дефолта не помогает? Я пробывал вардампить все переменные по цепочки вызова, но структуры данных там огромны и на подобное ковыряние уходит неадекватное количество времени.
galliard, Сдампите контейнер, посмотрите, какие сервисы зарегистрированы. В конце концов можно же просто посмотреть в скомпилированный контейнер и поискать там имя класса.
Алексей Скобкин, к сожалению запуску любой консольной команды, в то числе debug:container, препятствует та же ошибка. А debug:autowiring вообще не установлен, инструкцию по установке я нагуглить не смог.
Интересное наблюдение - я переименовал класс (и файл) в ValidationHttpException111, и в ошибке тут же эти единички появились.
Если класс все же удалить - команда срабатывает, но никакого упоминания об этом классе там уже нет.
Методом исключения нашел причину, она оказалась в файле app/config/services.yml, в строчке
AppBundle\:
resource: '../../src/AppBundle/*'
# you can exclude directories or files
# but if a service is unused, it's removed anyway
exclude: '../../src/AppBundle/{Entity,Repository,Tests}'
Я добавил папку в exclude папку AppBundle/Exception и проблема исчезла.
Хотя все равно странно, в другом проекте у меня есть такой же эксепшн и подобных проблем не возникало.
З.Ы. А вообще возможна ли ситуация, в которой эксепшн может потребоваться в виде сервиса? Что-то мне сложно представить этот кейс.
Алексей Скобкин, да, только к сожалению я так и не выяснил конкретную причину, по которой фреймворк решил зарегистрировать как сервис именно этот класс. И мое решение по сути является костылем, я только купировал проблему, но не решил её.
galliard, А что не так-то? resource: '../../src/AppBundle/*'
Тут явно говорится: "возьми всё, что здесь и сделай сервисом". Логично задать исключения для всего, что им быть не должно.
Алексей Скобкин, я конечно плохо понимаю что это за настройка такая, раньше как-то вообще внимания не обращал.
Но когда ранее создавал свои сервисы - мне приходилось прописывать их отдельно, давая им имя, указывая класс, аргументы конструктора, вызываемые методы, etc. И только тогда я мог дергать нужны сервис из контейнера. Так чтобы само пыталось регистрироваться - впервые вижу, хотя засирать папку AppBundle вроде никогда не стеснялся))