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

Дата обновления перевода 2021-12-24

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

Caution

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
// config/bundles.php
return [
    // 'all' means that the bundle is enabled for any Symfony environment
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
    Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
    Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
    Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true],
    Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
    Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
    // этот пакет включается только в 'dev'  и 'test', поэтому вы не можете использовать его в 'prod'
    Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
];

Tip

В приложении Symfony по умолчанию, которое использует Symfony Flex, пакеты подключаются и отключаются для вас автоматически при их установке или удалении, поэтому вам не нужно искать или редактировать файл bundles.php.

Cоздание пакета

Этот раздел создаёт и включает новый пакет, чтобы продемонстрировать, как это легко сделать. Новый пакет называется AcmeTestBundle, где часть Acme - просто шаблонное имя, которое нужно заменить неким именем "поставщика", который представляет вас или вашу организацию (например, ABCTestBundle для компании по имени ABC).

Начните с создания каталога src/Acme/TestBundle/ и добавьте в него новый файл под названием AcmeTestBundle.php:

1
2
3
4
5
6
7
8
// src/Acme/TestBundle/AcmeTestBundle.php
namespace App\Acme\TestBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeTestBundle extends Bundle
{
}

Tip

Имя AcmeTestBundle следует стандартным договоренностям присваивания имен пакетам. Вы также можете решить укоротить имя пакета до TestBundle, назвав этот класс TestBundle (и назвав файл TestBundle.php).

Этот пустой класс – единственное, что вам понадобится для создания нового пакета. Несмотря на то, что чаще всего он пуст, этот класс мощный по возможностям и может быть использован для настройки поведения пакета. Теперь, когда вы создали пакет, подключите его:

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

И хотя он пока ничего не делает, AcmeTestBundle готов к использованию.

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

Структура каталога пакета простая и гибкая. По умолчанию, система пакетов следует набору договоренностей, которые помогают создавать единообразный код для всех пакетов Symfony. Посмотрите на AcmeDemoBundle, так как он содержит некоторые самые распространенные элементы пакета:

Controller/
Содержит контроллеры пакета (например, RandomController.php).
DependencyInjection/
Содержит некоторые классы расширения внедрения зависимости, которые могут импортировать конфигурацию сервиса, регистрировать пропуски компилятора и т.д. (этот каталог не является обязательным).
Resources/config/
Содержит конфигурацию, включая конфигурацию маршрутов (например, routing.yaml).
Resources/views/
Содержит шаблоны, расположенные в алфавитном порядке по имени контроллера (например, Random/index.html.twig).
Resources/public/
Содержит веб-ресурсы (изображения, таблицы стилей и т.д.); он копируется или символически привязывается к каталогу проекта public/ с помощью командной строки assets:install.
Tests/
Содержит все тесты пакета.

Пакет может быть настолько большим или маленьким, насколько это диктует реализуемая им функция. Он содержит только те файлы, которые вам нужны, и ничего более.

По ходу прочтения книги, вы узнаете, как сохранять объекты в базе данных, создавать и валидировать формы, создавать переводы вашего приложения, писать тесты и многое другое. Каждая такая возможность имеет свое место и роль в рамках пакета.