vendor/coreshop/resource-bundle/DependencyInjection/Driver/AbstractDriver.php line 101

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * CoreShop
  5.  *
  6.  * This source file is available under two different licenses:
  7.  *  - GNU General Public License version 3 (GPLv3)
  8.  *  - CoreShop Commercial License (CCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  * @copyright  Copyright (c) CoreShop GmbH (https://www.coreshop.org)
  13.  * @license    https://www.coreshop.org/license     GPLv3 and CCL
  14.  *
  15.  */
  16. namespace CoreShop\Bundle\ResourceBundle\DependencyInjection\Driver;
  17. use CoreShop\Bundle\ResourceBundle\Controller\EventDispatcherInterface;
  18. use CoreShop\Bundle\ResourceBundle\Controller\ResourceFormFactoryInterface;
  19. use CoreShop\Bundle\ResourceBundle\Controller\ViewHandlerInterface;
  20. use CoreShop\Bundle\ResourceBundle\Form\Helper\ErrorSerializer;
  21. use CoreShop\Component\Resource\Factory\Factory;
  22. use CoreShop\Component\Resource\Factory\TranslatableFactoryInterface;
  23. use CoreShop\Component\Resource\Metadata\Metadata;
  24. use CoreShop\Component\Resource\Metadata\MetadataInterface;
  25. use CoreShop\Component\Resource\Metadata\RegistryInterface;
  26. use Symfony\Component\DependencyInjection\ContainerBuilder;
  27. use Symfony\Component\DependencyInjection\Definition;
  28. use Symfony\Component\DependencyInjection\Reference;
  29. abstract class AbstractDriver implements DriverInterface
  30. {
  31.     public function load(ContainerBuilder $containerMetadataInterface $metadata): void
  32.     {
  33.         $this->setClassesParameters($container$metadata);
  34.         if ($metadata->hasClass('admin_controller')) {
  35.             $this->addController($container$metadata);
  36.         }
  37.         $this->addManager($container$metadata);
  38.         $this->addRepository($container$metadata);
  39.         if ($metadata->hasClass('factory')) {
  40.             $this->addFactory($container$metadata);
  41.         }
  42.     }
  43.     protected function setClassesParameters(ContainerBuilder $containerMetadataInterface $metadata): void
  44.     {
  45.         if ($metadata->hasClass('model')) {
  46.             $container->setParameter(sprintf('%s.model.%s.class'$metadata->getApplicationName(), $metadata->getName()), $metadata->getClass('model'));
  47.         }
  48.         if ($metadata->hasClass('interface')) {
  49.             $container->setParameter(sprintf('%s.interface.%s'$metadata->getApplicationName(), $metadata->getName()), $metadata->getClass('interface'));
  50.         }
  51.         if ($metadata->hasClass('admin_controller')) {
  52.             $container->setParameter(sprintf('%s.admin_controller.%s.class'$metadata->getApplicationName(), $metadata->getName()), $metadata->getClass('admin_controller'));
  53.         }
  54.         if ($metadata->hasClass('factory')) {
  55.             $container->setParameter(sprintf('%s.factory.%s.class'$metadata->getApplicationName(), $metadata->getName()), $metadata->getClass('factory'));
  56.         }
  57.         if ($metadata->hasClass('repository')) {
  58.             $container->setParameter(sprintf('%s.repository.%s.class'$metadata->getApplicationName(), $metadata->getName()), $metadata->getClass('repository'));
  59.         }
  60.     }
  61.     protected function addController(ContainerBuilder $containerMetadataInterface $metadata): void
  62.     {
  63.         $definition = new Definition($metadata->getClass('admin_controller'));
  64.         $definition
  65.             ->setPublic(true)
  66.             ->setArguments([
  67.                 $this->getMetadataDefinition($metadata),
  68.                 new Reference($metadata->getServiceId('repository')),
  69.                 new Reference($metadata->getServiceId('factory')),
  70.                 new Reference($metadata->getServiceId('manager')),
  71.                 new Reference(ViewHandlerInterface::class),
  72.                 new Reference(EventDispatcherInterface::class),
  73.                 new Reference(ResourceFormFactoryInterface::class),
  74.                 new Reference(ErrorSerializer::class),
  75.             ])
  76.             ->addMethodCall('setContainer', [new Reference('service_container')])
  77.         ;
  78.         $container->setDefinition($metadata->getServiceId('admin_controller'), $definition);
  79.     }
  80.     protected function addFactory(ContainerBuilder $containerMetadataInterface $metadata): void
  81.     {
  82.         $factoryClass $metadata->getClass('factory');
  83.         $modelClass $metadata->getClass('model');
  84.         $definition = new Definition($factoryClass);
  85.         $definition->setPublic(true);
  86.         $definitionArgs = [$modelClass];
  87.         if (in_array(TranslatableFactoryInterface::class, class_implements($factoryClass))) {
  88.             $decoratedDefinition = new Definition(Factory::class);
  89.             $decoratedDefinition->setArguments($definitionArgs);
  90.             $definitionArgs = [$decoratedDefinition, new Reference('coreshop.translation_locale_provider')];
  91.         }
  92.         $definition->setArguments($definitionArgs);
  93.         $container->setDefinition($metadata->getServiceId('factory'), $definition);
  94.         if (method_exists($container'registerAliasForArgument')) {
  95.             foreach (class_implements($factoryClass) as $typehintClass) {
  96.                 $container->registerAliasForArgument(
  97.                     $metadata->getServiceId('factory'),
  98.                     $typehintClass,
  99.                     $metadata->getHumanizedName() . ' factory',
  100.                 );
  101.             }
  102.         }
  103.     }
  104.     protected function getMetadataDefinition(MetadataInterface $metadata): Definition
  105.     {
  106.         $definition = new Definition(Metadata::class);
  107.         $definition
  108.             ->setFactory([new Reference(RegistryInterface::class), 'get'])
  109.             ->setArguments([$metadata->getAlias()])
  110.         ;
  111.         return $definition;
  112.     }
  113.     abstract protected function addManager(ContainerBuilder $containerMetadataInterface $metadata): void;
  114.     abstract protected function addRepository(ContainerBuilder $containerMetadataInterface $metadata): void;
  115. }