Руководства > Бандлы
Версия: 3.2
Система бандла
Бандл напоминает плагин используемый программах, даже лучше. Ключевая разница в том, что в Symfony все есть бандл, включая код вашего приложения и основную функциональность фреймворка. Бандл - это первый сорт граждан в Symfony. Он дает гибкость, позволяя использовать готовые пакеты предоставляемые сторонними разработчиками, а так же возможность распространять свои бандлы. Все это позволяет легко выбирать какие функции включить в свое приложение и оптимизировать их под собственные нужды.
Здесь вы узнаете основы, в тоже время есть целая статья посвященная организации и лучшим практикам по бандлам
Бандл это просто структурированный набор файлов внутри директории, который реализует одну функциональность. Вы можете создать BlogBundle, ForumBundle или бандл для управления пользователями (множество из них уже создано и лежит открытом доступе). Каждая директория содержит все что связанно с данной функциональностью, включая PHP файл, шаблоны, файлы стилей, JavaScript файлы, тесты и вообще все что угодно. Каждый аспект функциональности существует в бандле и каждая функциональность живет в бандле.
Бандлы используемые в приложении должны быть подключены в методе registerBundles()
класса AppKernel
// 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;
}
Метод registerBundles()
предоставляет полный контроль над теми банлами которые используются в приложении (включая основные бандлы Symfony)
Бандл может жить где угодно так, как он загружается автоматически (через сформированный автозагрузчик app/autoload.php).
Создание
Symfony Standard Edition поставляется с уже созданным полно-функциональным бандлом. Конечно же создать его в ручную также просто.
Чтобы показать простоту системы бандлов, создадим и подключим новый бандл назвав его AcmeTestBundle.
Часть Acme просто вымышленное имя производителя, которое должно быть заменено на имя вашей организации (например ABCTestBundle для компании ABC )
Начнем с создания директории src/Acme/TestBundle/ и создадим в ней новый файл AcmeTestBundle.php
// src/Acme/TestBundle/AcmeTestBundle.php
namespace Acme\TestBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeTestBundle extends Bundle
{
}
Имя AcmeTestBundle соответсвует соглашению об именовании бандлов. Вы можете выбрать более короткое имя сократив название бандла до TestBundle, назвав класс TestBundle (а файл TestBundle.php)
Пустой класс это необходимая часть нового бандла. Несмотря на то, что он обычно пуст, этот класс обладает мощным потенциалом и может быть использован для изменения поведения бандла.
Теперь когда вы создали бандл, подключите его в классе AppKernel:
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
// register your bundle
new Acme\TestBundle\AcmeTestBundle(),
);
// ...
return $bundles;
}
And while it doesn't do anyt
И несмотря на то, что он пока ничего не делает, AcmeTestBundle готов к использованию.
И так же легко это можно сделать используя предоставляемый Symfony командный интерфейс для генерации базового скелета бандла:
$ php bin/console generate:bundle --namespace=Acme/TestBundle
Скелет бандла содержит базовый контроллер, шаблон и ресурсы маршрутизации, которые могут быть изменены по вашему усмотрению. Позже вы узнаете больше об инструментах командной строки Symfony.
Когда создаете новый бандл или используете сторонний, всегда помните, что бандл должен быть включен в registerBundles() . При использовании generate:bundle это делается автоматически.
Структура директории
Структура директории бандла простая и гибкая. По умолчанию система бандла следует набору соглашений которые помогают сохранять код согласованным между всеми бандлами Symfony. Взгляните на AcmeDemoBundle, который содержит некоторые общие элементы бандла:
Controller/
Содержит контроллеры бандла (например RandomController.php).
DependencyInjection/
Содержит определеные классы Dependency Injection Extension, которые могут импортировать конфигурацию сервиса, проходящий регистрацию компилятором и другое (данная директория не обязательна).
Resources/config/
Дом конфигурации, включает конфигурацию маршрутизации (например routing.yml).
Resources/views/
Содержит шаблоны упорядоченные по имени контроллера (например Random/index.html.twig).
Resources/public/
Содержит веб ресурсы (картинки, css, и т.п.) и копируется (либо создается символьная ссылка) в директории web/ проекта через команду assets:install.
Tests/
Содержит все тесты бандла.
Лучшие практики многоразовых бандлов | |
---|---|
Еще материалы
- Лучшие практики многоразовых бандлов
- Как создать дружественную конфигурацию для бандла
- Как загрузить конфигурацию сервиса внутри бандла
- Бандлы
- Как использовать наследование для переопределения частей бандла
- Как установить сторонний бандл
- Как переопределить любую часть бандла
- Как упростить конфигурацию множества бандлов
- Как удалить бандл