
Pimcore - это мощная open‑source MDM-система, которая решает задачу централизованного управления данными, их контроля и обогащения. Pimcore можно расширять, добавляя свой функционал, адаптируя систему под свои нужды и безнес-процессы. Более подробно о PIM разработке, читайте на нашем сайте.
В данной статье мы разберёмся, как создавать собственные пакеты (бандлы) в Pimcore, опишем структуру бандла, расскажем как создать installer для бандла и как подключить собственные JS и CSS файлы.
Для начала выясним, что такое бандл.
Бандл - это модульная единица, которая позволяет расширять функциональность основного приложения. Бандлы в Pimcore построены на основе концепции бандлов Symfony, что делает их мощным инструментом для добавления новых функций, интеграции сторонних сервисов и организации кода.
Создание структуры папок
1) В папке bundles создаем папку с названием компании, например - bundles/Astrio (можете использовать любое свое название).
2) Далее нужно создать папку с названием нашего бандла. Наш тестовый бандл будет называться - TestCreateBundle.

3) Далее создаем папку src - последующие файлы и папки будут создаваться в ней.
4) Создаем папку DependencyInjection - данная папка используется для хранения файлов конфигурации и сервисов, которые относятся к инъекции зависимостей.

Создание файлов и классов
В уже готовой папке DependencyInjection необходимо создать два класса:
1) Configuration.php - файл, который содержит конфигурацию сервисов для инъекции зависимостей. Он будет определять, какие сервисы будут доступны в общем контейнере и как они должны быть настроены.
<?php
declare(strict_types=1);
namespace Astrio\TestCreateBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
class Configuration implements ConfigurationInterface
{
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder(): TreeBuilder
{
return new TreeBuilder('test_create_bundle');
}
}
2) Далее создадаем класс bundles\Astrio\TestCreateBundle\src\DependencyInjection\AstrioTestCreateExtension.
В методе load создается экземпляр YamlFileLoader, который используется для загрузки YAML-файла конфигурации сервисов из папки Resources/config. Затем метод load загружает файл services.yaml, который должен содержать определения сервисов для инъекции зависимостей.
<?php
namespace Astrio\TestCreateBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
class AstrioTestCreateExtension extends Extension
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container): void
{
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.yaml');
}
}
3) Теперь создадим класс AstrioTestCreateBundle в папке src. Пока оставим его пустым, так как он будет наследоваться от Pimcore\Extension\Bundle\AbstractPimcoreBundle. В нём мы можем прописать зависимость от других бандлов, задать пути для css и js, но об этом мы расскажем в следующей статье.
4) Далее создаем папку src/Resources/config, в которой будет лежать файл services.yaml. В этом файле мы опишем конфигурацию по умолчанию:
services:
# конфигурация по умолчанию для служб в *этом* файле
_defaults:
# автоматически внедряет зависимости в ваши сервисы
autowire: true
# автоматически регистрирует ваши сервисы как команды, подписчики событий и т. д.
autoconfigure: true
# это означает, что вы не можете получать сервисы напрямую из контейнера через $container->get()
# Если вам нужно это сделать, вы можете переопределить этот параметр для отдельных сервисов.
public: false
5) Также нужно добавить наш бандл в файл config/bundles.php
<?php
return [
...
\Astrio\TestCreateBundle\AstrioTestCreateBundle::class => ['all' => true],
];
6) Теперь необходимо прописать зависимость в composer,json файле
"autoload": {
"psr-4": {
"Astrio\\TestCreateBundle\\": "bundles/Astrio/TestCreateBundle/src"
}
}
7) Затем применем shell команду
composer dump-autoload
Готово! Вы справились и содали свой собственный бандл!
Чтобы точно знать, что всё работает, используйте команду:
php bin/console pimcore:bundle:list
В списке должен быть ваш созданный бандл.
Подключение JS / CSS
Допустим, что далее мы хотим добавить свои css или js файлы. Способов для этого есть нескольно, но пока сосредоточемся на одном из них.
Чтобы это сделать, нам нужно:
1) В классе src\AstrioTestCreateBundle.php добавить имплементирование от интерфейса:
Pimcore\Extension\Bundle\PimcoreBundleAdminClassicInterface и используем трейт Pimcore\Extension\Bundle\Traits\BundleAdminClassicTrait
<?php
namespace Astrio\TestCreateBundle;
use Pimcore\Extension\Bundle\AbstractPimcoreBundle;
use Pimcore\Extension\Bundle\PimcoreBundleAdminClassicInterface;
use Pimcore\Extension\Bundle\Traits\BundleAdminClassicTrait;
class AstrioTestCreateBundle extends AbstractPimcoreBundle implements PimcoreBundleAdminClassicInterface
{
use BundleAdminClassicTrait;
public function getJsPaths(): array
{
return [
'/bundles/astriotestcreate/js/customjs/custom.js',
];
}
public function getCssPaths(): array
{
return [];
}
}
В функции getJsPath указываем путь до нашей js.
В папке Resources создаем public/js/customjs/custom.js
console.log("Добавили свой js файл")
После этого необходимо использовать команду:
php bin/console asset:install
Теперь, если вы зайдете в админку пимкора и откроете консоль, то увидете ваш вывод в консоль:
Таким же путём можно переопределять другие js , нужно просто соблюдать такой-же путь файла.
С CSS файлами всё то-же самое, что и с js.
Использование установщика
А что если складывается такая ситуация, что нам нужно использовать установщик, чтобы бандл сразу не активировался?
1) Для этого дополним класс Astrio\TestCreateBundle\AstrioTestCreateBundle
<?php
namespace Astrio\TestCreateBundle;
use Astrio\TestCreateBundle\Tools\Installer;
use Pimcore\Extension\Bundle\AbstractPimcoreBundle;
use Pimcore\Extension\Bundle\PimcoreBundleAdminClassicInterface;
use Pimcore\Extension\Bundle\Traits\BundleAdminClassicTrait;
class AstrioTestCreateBundle extends AbstractPimcoreBundle implements PimcoreBundleAdminClassicInterface
{
use BundleAdminClassicTrait;
public function getInstaller(): Installer
{
/** @var Installer $installer */
$installer = $this->container->get(Installer::class);
return $installer;
}
public function getJsPaths(): array
{
return [
'/bundles/astriotestcreate/js/customjs/custom.js',
];
}
public function getCssPaths(): array
{
return [];
}
}
2) После чего, надо будет создать Astrio\TestCreateBundle\Tools\Installer
<?php
namespace Astrio\TestCreateBundle\Tools;
use Pimcore\Extension\Bundle\Installer\SettingsStoreAwareInstaller;
class Installer extends SettingsStoreAwareInstaller
{
public function install(): void
{
//Описываем логику для установки
parent::install();
}
public function uninstall(): void
{
//Описываем логику для удаления
parent::uninstall();
}
}
3) И добавить в наш services.yaml определения нашего сервиса:
Astrio\TestCreateBundle\Tools\Installer:
public: true
arguments:
$bundle: "@=service('kernel').getBundle('AstrioTestCreateBundle')"
Теперь при использовании команды:
php bin/console pimcore:bundle:list
мы видим, что наш бандл может быть устанавливаемым и удаляемым.
На данном этапе он может быть устанавливаемым (Installable = true).

Далее мы можем установить или удалить наш бандл
bin/console pimcore:bundle:install AstrioTestCreateBundle<br/> bin/console pimcore:bundle:uninstall AstrioTestCreateBundle<br/>
Друзья, в этой статье мы постарались научить вас создавать собственные бандлы. Теперь у вас есть свой пустой бандл со своим установщиком. Далее эта "заготовка" будет использована для дальнейшего расширения функционала системы, следите за апдейтами в нашем блоге!
