Служебный бандл, позволяющий получить экземпляр контейнера за пределами Symfony в кастомных (Wordpress, Bitrix) вариантах использования
INTERNAL
composer.json:
"repositories": [
{
"type": "git",
"url": "https://github.com/proklung/container.locator.bundle"
}
]
composer require proklung/container-locator-bundle
Эксперимент. Сейчас хэлпер container
в моих пакетах обращается
к основному классу ServiceProvider
, что нормально. Способ, реализуемый в этом бандле - альтернативный, представялется,
что выглядит малость "чище".
Основан на знании, что в каждый инициированый бандл по методу boot
загоняется экземпляр контейнера.
Все, что делается в этом бандле - декорируется метод setContainer
бандла, сохраняя контейнер в статическое свойство.
Плюс отвязывается от конкретной реализации контейнера.
Класс ContainerLocator
:
- статический метод
instanceFromBundles()
- из файла конфигураций бандлов. Стоимость - загрузка файла и перебор классов, пока не будет найден бандл, имеющий методgetContainer
. - статический метод
instance()
- из класса этого бандла.
В результате хэлпер container
может выглядеть как-то так:
function container($classContainer = ContainerLocator::class)
{
$container = $classContainer::instance();
if ($container === null) {
throw new RuntimeException(
'Service container '. is_object($classContainer) ? get_class($classContainer) : $classContainer.
' not initialized.'
);
}
return $container;
}
Для использования в неконтейнеродружелюбных местах (внутри компонентов Битрикс и т.п)
Класс ContainerHelper
:
public static function kernel()
- Kernelpublic static function kernelParameters()
- Параметры Kernelpublic static function parameter(string $param)
- Конкретный параметр Kernel.public static function twig()
- Twig.public static function session()
- Session.public static function logger()
- Logger (сервисpublic.logger
).