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

Дата оновлення перекладу 2024-04-30

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

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

Шаблони

Шаблони сторонні пакетів можуть бути перевизначені у каталозі <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).

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

Контролери

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

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

Якщо ви хочете змінити сервіси, створені пакетом, ви можете використати декорування сервіса.

Якщо ви хочете виконати складніші дії, наприклад, вилучити сервіси, створені іншими пакетами, вам слід працювати з визначеннями сервіса всередині передачі компілятора.

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

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

Форми

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

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

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

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

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.