Як перевизначити будь-яку частину пакета

Дата оновлення перекладу 2022-12-11

Як перевизначити будь-яку частину пакета

При використанні сторонніх пакетів ви можете захотіти налаштувати або перевизначити деякі з їх функцій. Цей документ описує способи перевизначення найрозповсюдженіших функцій пакета.

Tip

Механізм перевизначення пакета означає, що ви не можете використовувати фізичні шляхи для посилання на джерела пакета (наприклад, __DIR__/config/services.xml). Завжди використовуйте логічні шляхи у ваших пакетах (наприклад, @FooBundle/Resources/config/services.xml)
та викликйте метод locateResource() , щоб перетворити їх на фізичні шляхи за необхідності.

Шаблони

Шаблони сторонні пакетів можуть бути перевизначені у каталозі <your-project>/templates/bundles/<bundle-name>/. Нові шаблони повинні використовувати ті ж імʼя та шлях шаблоны (відносно <bundle>/templates/), що й оригінальні шаблони.

Наприклад, для перевизначенна шаблону templates/registration/confirmed.html.twig з FOSUserBundle, створіть цей шаблон: <your-project>/templates/bundles/AcmeUserBundle/registration/confirmed.html.twig

Caution

Після додавання шаблона у нове місце, можливо вам необхідно буде очистити кеш (php bin/console cache:clear), навіть якщо ви у режимі налагодження.

Замість перевизначення цілого шаблону, ви можете захотіти перевизначити тільки один або більше блоків. Однак, так як ви перевизначаєте шаблон, з якого ви хочете розширюватись, ви отримаєте нескінченну петлю помилки. Рішенням буде використати спеціальний префікс ! в імені шаблону, щоб повідомити Symfony, що ви хочете розширити з початкового шаблону, а не з перевизначеного:

1
2
3
4
5
6
7
{# templates/bundles/AcmeUserBundle/registration/confirmed.html.twig #}
{# спеціальний префікс '!' уникає помилок при розширенні з перевизначеного шаблону #}
{% extends "@!AcmeUser/registration/confirmed.html.twig" %}

{% block some_block %}
    ...
{% endblock %}

Tip

Сама Symfony теж використовує деякі пакети, тому ви можете використовувати такий же підхід для перевизначення шаблонів ядра Symfony. Наприклад, ви можете налаштувати сторінки помилок, перевизначаючи шаблони TwigBundle.

Маршрутизація

Маршрутизація в Symfony ніколи не імпортується автоматично. Якщо ви хочете додати маршрут з будь-якого пакета, то вони мають бути імпортовані вручну звідкись з вашого додатку (наприклад, config/routes.yaml).

Найпростіший спосів "перевизначити" маршрутизацію пакета - не імпортувати її взагалі. Замість імпортування маршрутизації стороннього пакета, просто скопіюйте файл маршрутизації у ваш додаток, змініть його та імпортуйте.

Контролери

Якщо контролер є сервісом, дивіться наступний розділ про те, як перевизначити його. У іншому випадку, визначте новий маршрут + контролер з одним шляхом, повʼязаним з контролером, який ви хочете визначити (і переконайтеся, що новий маршрут завантажується до маршруту пакета).

Сервіси та конфігурація

If you want to modify the services created by a bundle, you can use service decoration.

If you want to do more advanced manipulations, like removing services created by other bundles, you must work with service definitions inside a compiler pass.

Сутності та їх відображення

У звʼязку з особливостями роботи Doctrine, неможливо перевизначити відображення сутностей пакета. Однак, якщо пакет надає відображений суперклас (як, наприклад, сутність User в FOSUserBundle), то можна перевизначити атрибути та асоціації. Дізнайтеся більше про цю функцію та її обмеженнях у документації Doctrine.

Форми

Існуючі типи форм можуть бути змінені шляхом визначення розширень типу форми.

Метадані валідації

Symfony завантажує всі файли конфігурації валідації з кожного пакета та комбінує їх в одне дерево метаданих валідації. Це означає, що ви можете додати нові обмеження до властивості, але ви не можете перевизначити їх.

Щоб обійти це, сторонній пакет повинен мати конфігурацію для груп валідації. Наприклад, FOSUserBundle має таку конфігурацію. Щоб створити вашу власну валідацію, додайте обмеження до нової групи валідації:

  • YAML
  • XML
1
2
3
4
5
6
7
8
9
10
# config/validator/validation.yaml
FOS\UserBundle\Model\User:
    properties:
        plainPassword:
            - NotBlank:
                groups: [AcmeValidation]
            - Length:
                min: 6
                minMessage: fos_user.password.short
                groups: [AcmeValidation]

Тепер, оновіть конфігурацію FOSUserBundle так, щоб він вікористовував ваші групи валідації замість початкових.

Переклади

Перекади не повʼязані з пакетами, але повʼязані з доменами. Це означає, що ви можете перевизначити будь-який файл перекладу пакета з основного каталогу translations/, якщо новий файл використовуватиме той самий домен.

Наприклад, для перевизначення перекладів, визначених у файлі translations/AcmeUserBundle.es.yaml AcmeUserBundle, створіть файл <your-project>/translations/AcmeUserBundle.es.yaml.