Система пакетів

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

Система пакетів

Caution

В версіях Symfony до 4.0, було рекомендовано впорядковувати ваш код, використовуючи пакети. Це більше не рекомендується, і пакети мають бути використані лише для того, щоб ділитися кодом та функціями поміж декількома додатками.

Пакет схожий на плагін в інших ПЗ, тільки краще. Базові функції фреймворку Symfony реалізуються за допомогою пакетів FrameworkBundle, SecurityBundle, DebugBundle, та ін.). Вони також використовуються для додавання нових функцій в ваш застосунок через сторонні пакети.

Пакети, які використовуються в вашому додатку, мають бути підключені для кожного середовища в файлі config/bundles.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// config/bundles.php
return [
    // 'all' означає, що пакет підключено для будь-якого середовища Symfony
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    // ...

    // цей пакет вмікається тільки в 'dev'
    Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true],
    // ...

    // цей пакет вмікається тільки в 'dev' та 'test', тому ви не можете використовувати його в 'prod'
    Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
    // ...
];

Tip

В додатку Symfony за замочуванням, який використовує Symfony Flex, пакети підключаються та відключаться для вас автоматично при їх установці або видаленні, тому вам не потрібно шукати або редагувати файл bundles.php.

Створення пакету

Цей розділ створює та підключає новий пакет, щоб продемонструвати, як легко це зробити. Новий пакет називається AcmeTestBundle, де частина Acme - просто шаблонне ім'я, яке необхідно замінити деяким іменем "постачальника", який представляє вас або вашу організацію (наприклад, ABCTestBundle для компанії з назвою Abc).

Почніть зі створення нового класу під назвою AcmeBlogBundle:

1
2
3
4
5
6
7
8
// src/AcmeBlogBundle.php
namespace Acme\BlogBundle;

use Symfony\Component\HttpKernel\Bundle\AbstractBundle;

class AcmeBlogBundle extends AbstractBundle
{
}

Caution

Якщо ваш пакет має бути сумісним з попередніми версіями Symfony, вам потрібно натомість розширювати з Bundle.

Tip

Ім'я AcmeTestBundle слідує стандартним домовленностям іменування пакетів . Ви також можете вирішити скоротити ім'я пакету до TestBundle, назвавши цей клас TestBundle (та назвавши файл TestBundle.php).

Цей порожній клас - єдине, що вам знадобиться для створення нового пакету. Незважаючи на те, що частіше за все він пустий, цей клас потужний за можливостями та може бути використаний для налаштування поведінки пакету. Тепер, коли ви створили пакет, підключіть його:

1
2
3
4
5
// config/bundles.php
return [
    // ...
    Acme\BlogBundle\AcmeBlogBundle::class => ['all' => true],
];

І хоча він поки що нічого не робить, AcmeTestBundle готовий до використання.

Структура каталогу пакету

Структура каталогів пакету призначена для того, щоб допомогти підтримувати узгодженість коду між усіма пакетами Symfony. Вона слідує набору угод, але є гнучкою і може бути налаштована за потреби:

assets/
Містить JavaScript, CSS, зображення та інші ресурси, повʼязані з пакетом, яі не знаходяться в public/ (наприклад, контролери stimulus)
config/
Містить конфігурацію, включно з конфігурацією маршрутизації (наприклад, routing.yaml).
public/
Містить веб-ресурси (зображення, таблиці стилів тощо) та копіюється або символьно посилається на public/ каталог проекту через консольну команду assets:install.
src/
Містить всі PHP-класи, повʼязані з логікою пакету (наприклад, Controller/RandomController.php).
templates/
Містить шаблони, згруповані за іменем контролера (наприклад, random/index.html.twig).
tests/
Містить всі тести для пакетів.
translations/
Містить переклади, згруповані за доменом та локаллю (наприклад, AcmeTestBundle.en.xlf).

Caution

Рекомендована структура пакетів була змінена у Symfony 5, прочитайте Документацію пакетів Symfony 4.4 для отримання інформації про стару структуру.

При використанні нового класу AbstractBundle, пакет за замовчуванням має нову структуру. Перевизначте метод Bundle::getPath() для зміни на стару структуру :

1
2
3
4
5
6
7
class AcmeBlogBundle extends AbstractBundle
{
    public function getPath(): string
    {
        return __DIR__;
    }
}

Tip

Рекомендується використовувати стандарт автозавантаження PSR-4: використовувати простір імен як ключ, а розташування головного класу пакету (відносно composer.json) - як значення. Так як головний клас знаходиться у каталозі пакету src/:

1
2
3
4
5
6
7
8
9
10
11
12
{
    "autoload": {
        "psr-4": {
            "Acme\\BlogBundle\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Acme\\BlogBundle\\Tests\\": "tests/"
        }
    }
}