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

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

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

Note

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

Пакет – это просто структурированный набор файлов в каталоге, который реализует одну функцию. Вы можете создать BlogBundle (пакет блога), ForumBundle (пакет форума) или пакет для пользовательского управления (многие из них уже существуют в открытом доступе). Каждый каталог содержит все, связанное с этой функцией, включая PHP-файлы, шаблоны, таблицы стиля, файлы JavaScript, тесты и прочее. Каждый аспект функции существует в пакете, и каждая функция «живет» в пакете.

Пакеты, используемые в вашем приложении, должны быть активированы путем регистрации в методе registerBundles() в классе AppKernel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new AppBundle\AppBundle(),
    );

    if (in_array($this->getEnvironment(), array('dev', 'test'))) {
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    }

    return $bundles;
}

C помощью метода registerBundles() вы можете полностью контролировать то, какие пакеты используются вашим приложением (включая пакеты ядра Symfony).

Tip

Пакет может находиться где угодно, при условии, что его можно загрузить автоматически (с помощью автозагрузчика в app/autoload.php).

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

Symfony Standard Edition (стандартная версия) имеет удобную задачу, которая создает для вас полностью функциональный пакет. Конечно, создать пакет вручную тоже достаточно легко.

Чтобы увидеть, насколько проста система пакетов, создайте новый пакет под названием AcmeTestBundle и активируйте его.

Tip

Часть Acme в названии – это просто пример, который нужно изменить на какое-либо имя вашей организации (например, ABCTestBundle для фирмы под названием ABC).

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

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

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeTestBundle extends Bundle
{
}

Tip

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

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

Теперь, когда вы создали пакет, активируйте его с помощью класса AppKernel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        // ...

        // зарегистрируйте ваш пакет
        new Acme\TestBundle\AcmeTestBundle(),
    );
    // ...

    return $bundles;
}

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

С такой же легкостью Symfony предоставляет интерфейс командной строки для создания базового каркаса пакета:

1
$ php bin/console generate:bundle --namespace=Acme/TestBundle

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

Tip

Каждый раз, при создании нового пакета, или при использовании стороннего пакета, проверяйте, был ли пакет активирован в registerBundles(). При использовании команды generate:bundle это будет сделано за вас автоматически.

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

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

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

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

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.