<?php
namespace Moka\Cms;
use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass;
use Doctrine\DBAL\Types\Type;
use Moka\Cms\Bridge\Doctrine\Autoloader;
use Moka\Cms\Bridge\Doctrine\Types\ComponentJsonType;
use Moka\Cms\Bridge\Doctrine\Types\EntriesJsonType;
use Moka\Cms\Bridge\Doctrine\Types\MatrixJsonType;
use Moka\Cms\DependencyInjection\Compiler\EntityMappingPass;
use Moka\Cms\Draft\Merger\MergerInterface;
use Moka\Cms\Generator\FieldProcessor\FieldProcessorInterface;
use Moka\Cms\Media\Type\TypeInterface;
use Moka\Cms\Plugin\PluginInterface;
use Moka\Cms\Renderer\RendererInterface;
use Moka\Cms\Widget\WidgetInterface;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class MokaCmsBundle extends Bundle
{
private $autoloader;
public function __construct()
{
if (!Type::hasType(MatrixJsonType::NAME)) {
Type::addType(MatrixJsonType::NAME, MatrixJsonType::class);
}
if (!Type::hasType(ComponentJsonType::NAME)) {
Type::addType(ComponentJsonType::NAME, ComponentJsonType::class);
}
if (!Type::hasType(EntriesJsonType::NAME)) {
Type::addType(EntriesJsonType::NAME, EntriesJsonType::class);
}
}
public function build(ContainerBuilder $container)
{
parent::build($container);
$container
->addCompilerPass(DoctrineOrmMappingsPass::createXmlMappingDriver([realpath(__DIR__.'/Resources/config/doctrine') => 'Moka\Cms\Entity']), PassConfig::TYPE_BEFORE_OPTIMIZATION, 0)
->addCompilerPass(new EntityMappingPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 0);
$container->registerForAutoconfiguration(WidgetInterface::class)->addTag('moka_cms.widget');
$container->registerForAutoconfiguration(RendererInterface::class)->addTag('moka_cms.renderer');
$container->registerForAutoconfiguration(TypeInterface::class)->addTag('moka_cms.media.type');
$container->registerForAutoconfiguration(MergerInterface::class)->addTag('moka_cms.entry.merger');
$container->registerForAutoconfiguration(FieldProcessorInterface::class)->addTag('moka_cms.generator.field.processor');
$container->registerForAutoconfiguration(PluginInterface::class)->addTag('moka_cms.plugin');
}
public function boot()
{
$entityDir = $this->container->getParameter('moka_cms.doctrine.entity_dir');
$entityNamespace = $this->container->getParameter('moka_cms.doctrine.entity_namespace');
$this->autoloader = Autoloader::register($entityDir, $entityNamespace);
/* @phpstan-ignore-next-line */
Type::getType(MatrixJsonType::NAME)->setSerializer($this->container->get('moka_cms.doctrine_json_serializer'));
/* @phpstan-ignore-next-line */
Type::getType(ComponentJsonType::NAME)->setSerializer($this->container->get('moka_cms.doctrine_json_serializer'));
/* @phpstan-ignore-next-line */
Type::getType(EntriesJsonType::NAME)->setSerializer($this->container->get('moka_cms.doctrine_json_serializer'));
}
public function shutdown()
{
if (null !== $this->autoloader) {
spl_autoload_unregister($this->autoloader);
$this->autoloader = null;
}
}
}