Перейти к основному содержимому

Коллекция бандлов

BundleCollection — это контейнер, используемый для регистрации каждого используемого бандла. Поскольку Pimcore собирает бандлы из нескольких источников (через код в App\Kernel и через конфигурацию config/bundles.php), использование единого API для их регистрации является целесообразным.

В то время как стандартное издание Symfony использует метод registerBundles для создания массива загружаемых бандлов, Pimcore ожидает, что вы будете регистрировать свои бандлы в методе registerBundlesToCollection(), используя объект коллекции.

Бандлы без указанного приоритета регистрируются с приоритетом 0 по умолчанию. Вы можете установить отрицательное значение, если вам нужно задать приоритет ниже стандартного.

Примеры использования коллекции бандлов:

<?php  

namespace App;

use Pimcore\HttpKernel\BundleCollection\BundleCollection;
use Pimcore\HttpKernel\BundleCollection\Item;
use Pimcore\HttpKernel\BundleCollection\LazyLoadedItem;
use Pimcore\Kernel as PimcoreKernel;

class Kernel extends PimcoreKernel
{
public function registerBundlesToCollection(BundleCollection $collection): void
{
// Добавление бандла
$collection->addBundle(new BundleA());

// Добавление бандла с высоким приоритетом и ограничением по среде
$collection->addBundle(new BundleB(), 10, ['dev']);

// Повторное добавление бандла — оно будет проигнорировано, сохранится приоритет 10
$collection->addBundle(new BundleB());

// Добавление бандла через строку для ленивой загрузки (lazy load)
// Экземпляр класса будет создан только тогда, когда он действительно понадобится.
// Это рекомендуется для всех элементов с ограничениями по среде.
$collection->addBundle(BundleC::class, 10, ['dev']);

// addBundle() — это обертка для метода add(), который можно использовать напрямую
$collection->add(new Item(new BundleD(), 10, ['dev', 'prod']));

// addBundle() — это обертка для метода add(), который можно использовать напрямую
$collection->add(new LazyLoadedItem(BundleE::class, 10, ['dev']));

// Коллекция ожидает ItemInterface — при необходимости можно реализовать
// свой тип элемента
$collection->add(new FancyItem(/* ваши параметры */));
}
}

Зависимости бандлов

Если ваш бандл зависит от других бандлов (например, использует функции стороннего решения), вам необходимо убедиться, что зависимый бандл загружается вместе с вашим. Вы можете либо проинструктировать пользователей вручную подключать зависимости в их App\Kernel, либо реализовать DependentBundleInterface в своем бандле:

<?php  

namespace CustomBundle;

use Pimcore\HttpKernel\Bundle\DependentBundleInterface;
use Pimcore\HttpKernel\BundleCollection\BundleCollection;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class CustomBundle extends Bundle implements DependentBundleInterface
{
public static function registerDependentBundles(BundleCollection $collection): void
{
// Регистрируйте любые бандлы, от которых зависит ваш проект
$collection->addBundle(new FooBundle);
}
}

Важно: метод registerDependentBundles вызывается сразу после добавления вашего бандла в коллекцию. Даже если ваш бандл имеет ограничения по среде, зависимости будут добавлены. Если вам нужно ограничить среды для зависимостей, используйте аргумент env в методе addBundle(). Для оптимизации производительности следует добавлять зависимости как «ленивые» (lazy), передавая имя класса строкой или напрямую используя addItem и передав экземпляр LazyLoadedItem. Это гарантирует, что экземпляр бандла будет создан только при необходимости.

Пример:

<?php  

// ...
use Pimcore\HttpKernel\BundleCollection\LazyLoadedItem;

class CustomBundle extends Bundle implements DependentBundleInterface
{
public static function registerDependentBundles(BundleCollection $collection): void
{
// Передаем имя класса строкой и ограничиваем средой dev
$collection->addBundle(FooBundle::class, 0, ['dev']);

// напрямую добавьте LazyLoadedItem - это то, что addBundle делает внутренне, когда получает строку
$collection->add(new LazyLoadedItem(FooBundle::class, 0, ['dev']));
}
}

Переопределение элементов коллекции

Если бандл определяет зависимость с неподходящим приоритетом или ограничениями среды для вашего конкретного проекта, вы можете переопределить это определение. Для этого добавьте нужный бандл в коллекцию до того, как он будет загружен как зависимость. Pimcore проигнорирует повторную попытку регистрации из зависимости и использует ваш вариант. Допустим, CustomBundle требует FooBundle с приоритетом 10, но вам нужен приоритет 25:

<?php  

// ...

class CustomBundle extends Bundle implements DependentBundleInterface
{
public static function registerDependentBundles(BundleCollection $collection): void
{
$collection->addBundle(FooBundle::class, 10);
}
}

Чтобы переопределить это, зарегистрируйте FooBundle вручную с вашим приоритетом:

<?php  
namespace App;

use Pimcore\HttpKernel\BundleCollection\BundleCollection;
use Pimcore\Kernel as PimcoreKernel;

class Kernel extends PimcoreKernel
{
public function registerBundlesToCollection(BundleCollection $collection): void
{
// Регистрируем FooBundle вручную
$collection->addBundle(FooBundle::class, 25);

// При регистрации CustomBundle его внутренняя попытка добавить FooBundle будет проигнорирована
$collection->addBundle(new \CustomBundle\CustomBundle);
}
}


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.