Эта глава быстро наставит вас на путь истинный

Шаблоны

Если хотите переопределить шаблоны, смотрите главы

Маршруты

Маршруты никогда не испортируются в Symfony автоматически. Если вы хотите включить пути из другого bundle, тогда вы должны вручную импортировать в ваше приложение ( например app/config/routing.yml ).

Самый просто способ “переопределять” пути – это никогда их не импортировать. Вместо этого скопируйте пути из сторонней библиотеки в ваше приложение, измените их и вставьте.

Контроллеры

Предположим что сторонний бандле не добавляется в сервисы ( так обычно и бывает ), вы можете легко переопределить контроллеры посредством наследования бандлов. Для больше информации смотрите How to use Bundle Inheritance to Override parts of a Bundle. Если же контроллеры – это сервисы, то следующая часть статьи для вас.

Сервисы & конфигурация

Чтобы переоперделить/расширить сервисы, существует 2 способа. Первый, вы можете установить ваш собственный класс как раметр к классу сервиса в app/config/config.yml. Этот способ возможен только если имя классы определено как параметр в конфигурации бандла. Например, чтобы переопределить класс для Symfony сервиса translator, вы можете переопределить параметр translator.class. Иногда чтобы найти какой параметр можно переопредить надо немного погуглить. Для translator, параметр определен и используется в Resources/config/translation.xml в ядре FrameworkBundle:

Второй способ, если класс не определен как параметр, вы хотите быть уверены что класс всегда переопределен когда вы используете бандл, или вам нужно изменить не только имя класса, вы должны использовать compiler pass:

В этом примере вы запрашиваете определенный оригинальный сервис, и устанавливаете свой класс вместо оригинального.

Смотри How to work with compiler Passes in Bundles для понимания как использовать compiler pass. Если хотите делать больше чем просто переопределять класс – добавить вызов метода – вы можете исплользовать только compiler pass метод.

Сущности & мапинг сущности

Из-за особенностей работы Doctrine, невозможно переопределить мапинг сущности бандла. Однако, если бандлы предоставляет суперкласс ( такой как User сущность в FOSUserBundle ) вы можете переопределить атрибуты и ассоциации. Узнай больше об этой фичи и ограничения в документаци Doctrine

Формы

Для того чтобы переопределить тип формы, оно должно быть зарекестрировано как сервис ( т.е. помечен как “form.type” ). Вы можете также переопределить как обычный сервис как это мы делали в Сервисы & Конфигурации. Это будет работать только если тип называется его превдонимом вместо экземпляра:

а не

Данные валидации

Symfony загружает все валидаторы из файлов каждого бандла и комбинирует в дерево валидации. Это значит что вы можете добавить свои ограничения к свойству, но вы не можете переопределить их.

чтобы переопределить их, сторонний бандл должен иметь кофигурацию для указания группы валидаций. Например, FOSUserBundle имеет такую. Чтобы создать свою собственную валидащии, добавьте ограничения в новую группу валидации:

Теперь, обновите конфигурацию FOSUserBundle, теперь используется ваша группа валидации вместо оригинальной.

Переводы

Переводы не относятся к бандлам, но ссылаются. Это значит что вы можете переопределить переводы из любого файла перевода, до тех пора по он в the correct domain.

[su_spoiler open=”yes” icon=”” class=”my-spoiler caution” title=””]

Последний файл перевода всегда перекрывает предыдущие. Это значит что вы должны быть убеждены что ваши переводы загружаются после бандлов чьи переводы вы переопределяете. За этим следит AppKernel.

Последними всегда загружаются файлы, которые находятся в app/Resources/translations.

[/su_spoiler]