Symfony: переопределить плагин-модель в другом плагине
Мы создаем новый веб-сайт, который будет использовать существующее программное обеспечение Symfony, используемое другим веб-сайтом. Я перемещаю повторно используемые компоненты в плагин ("app-plugin"), чтобы избежать дублирования кода и данных. Плагин будет настроен как svn-external в репозиториях svn сайтов.
Существующий экземпляр Symfony содержит переопределенные классы доктрин (модели, формы, фильтры форм), которые изначально определены в других плагинах (например, sfDoctrineGuardPlugin). Переопределенные классы могут быть повторно использованы обоими экземплярами symfony, поэтому я собираюсь переместить их в "app-plugin". Но это вызывает проблемы:
Если кто-то, например, бежит symfony doctrine:build-forms
перемещенные файлы будут воссозданы задачей внутри lib / form / doctrine и будут содержать пустые определения классов. Причина для меня очень ясна: как Symfony должен был знать, что "app-plugin" уже определяет эти классы форм? Единственный способ - это автоматически загрузить все классы перед выполнением задачи и проверить, доступны ли уже классы.
Обходной путь должен был бы исключить эти классы в config / autoload.yml плагина приложения. Но есть ли лучший способ?
редактировать
Я использую термин "приложение-плагин", чтобы избежать путаницы между обычным плагином (например, sfGuard) и нашим плагином, который содержит общие компоненты.
До:
После:
2 ответа
Кажется, нет лучшего способа, чем исключить оригинальную модель в config / autoload.yml для плагина приложения. Даже если вы можете получить классы моделей, как показано на изображениях выше, у вас возникнут проблемы, как только вы запустите задачу build-forms. Я просмотрел исходный код генератора форм, который показывает, что это невозможно. Поэтому единственными решениями являются: избегать задачи build-forms, переписывать генератор форм или, как уже говорилось, использовать autoload.yml.
Что это за "приложение-плагин", о котором вы говорите? Обычно все, что вам нужно сделать, это оставить свои переопределенные классы там, где они есть, и переместить код, который они содержат, в родительские классы, которые должны быть в плагине. И если вы хотите изменить поведение определенного приложения Symfony, то вы можете редактировать эти переопределенные классы.