vendor/sylius/resource-bundle/src/Bundle/DependencyInjection/Driver/Doctrine/DoctrinePHPCRDriver.php line 27

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Sylius package.
  4.  *
  5.  * (c) Paweł Jędrzejewski
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace Sylius\Bundle\ResourceBundle\DependencyInjection\Driver\Doctrine;
  12. use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\DefaultParentListener;
  13. use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\NameFilterListener;
  14. use Sylius\Bundle\ResourceBundle\Doctrine\ODM\PHPCR\EventListener\NameResolverListener;
  15. use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
  16. use Sylius\Component\Resource\Metadata\MetadataInterface;
  17. use Symfony\Component\DependencyInjection\ContainerBuilder;
  18. use Symfony\Component\DependencyInjection\Definition;
  19. use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
  20. use Symfony\Component\DependencyInjection\Parameter;
  21. use Symfony\Component\DependencyInjection\Reference;
  22. @trigger_error(sprintf('The "%s" class is deprecated since Sylius 1.3. Doctrine MongoDB and PHPCR support will no longer be supported in Sylius 2.0.'DoctrinePHPCRDriver::class), \E_USER_DEPRECATED);
  23. final class DoctrinePHPCRDriver extends AbstractDoctrineDriver
  24. {
  25.     /**
  26.      * {@inheritdoc}
  27.      */
  28.     public function load(ContainerBuilder $containerMetadataInterface $metadata): void
  29.     {
  30.         parent::load($container$metadata);
  31.         $this->addResourceListeners($container$metadata);
  32.     }
  33.     protected function addResourceListeners(ContainerBuilder $containerMetadataInterface $metadata): void
  34.     {
  35.         $defaultOptions = [
  36.                 // if no parent is given default to the parent path given here.
  37.                 'parent_path_default' => null,
  38.                 // auto-create the parent path if it does not exist.
  39.                 'parent_path_autocreate' => false,
  40.                 // set true to always override the parent path.
  41.                 'parent_path_force' => false,
  42.                 // automatically replace invalid characters in the node name
  43.                 // with a blank space.
  44.                 'name_filter' => true,
  45.                 // automatically resolve same-name-sibling conflicts.
  46.                 'name_resolver' => true,
  47.         ];
  48.         $metadataOptions $metadata->hasParameter('options') ? $metadata->getParameter('options') : [];
  49.         if ($diff array_diff(array_keys($metadataOptions), array_keys($defaultOptions))) {
  50.             throw new InvalidArgumentException(sprintf(
  51.                 'Unknown PHPCR-ODM configuration options: "%s"',
  52.                 implode('", "'$diff)
  53.             ));
  54.         }
  55.         $options array_merge(
  56.             $defaultOptions,
  57.             $metadataOptions
  58.         );
  59.         $createEventName sprintf('%s.%s.pre_%s'$metadata->getApplicationName(), $metadata->getName(), 'create');
  60.         $updateEventName sprintf('%s.%s.pre_%s'$metadata->getApplicationName(), $metadata->getName(), 'update');
  61.         if ($options['parent_path_default']) {
  62.             $defaultPath = new Definition(DefaultParentListener::class);
  63.             $defaultPath->setArguments([
  64.                 new Reference($metadata->getServiceId('manager')),
  65.                 $options['parent_path_default'],
  66.                 $options['parent_path_autocreate'],
  67.                 $options['parent_path_force'],
  68.             ]);
  69.             $defaultPath->addTag('kernel.event_listener', [
  70.                 'event' => $createEventName,
  71.                 'method' => 'onPreCreate',
  72.             ]);
  73.             $container->setDefinition(
  74.                 sprintf(
  75.                     '%s.resource.%s.doctrine.odm.phpcr.event_listener.default_path',
  76.                     $metadata->getApplicationName(),
  77.                     $metadata->getName()
  78.                 ),
  79.                 $defaultPath
  80.             );
  81.         }
  82.         if ($options['name_filter']) {
  83.             $nameFilter = new Definition(NameFilterListener::class);
  84.             $nameFilter->setArguments([
  85.                 new Reference($metadata->getServiceId('manager')),
  86.             ]);
  87.             $nameFilter->addTag('kernel.event_listener', [
  88.                 'event' => $createEventName,
  89.                 'method' => 'onEvent',
  90.             ]);
  91.             $nameFilter->addTag('kernel.event_listener', [
  92.                 'event' => $updateEventName,
  93.                 'method' => 'onEvent',
  94.             ]);
  95.             $container->setDefinition(
  96.                 sprintf(
  97.                     '%s.resource.%s.doctrine.odm.phpcr.event_listener.name_filter',
  98.                     $metadata->getApplicationName(),
  99.                     $metadata->getName()
  100.                 ),
  101.                 $nameFilter
  102.             );
  103.         }
  104.         if ($options['name_resolver']) {
  105.             $nameResolver = new Definition(NameResolverListener::class);
  106.             $nameResolver->setArguments([
  107.                 new Reference($metadata->getServiceId('manager')),
  108.             ]);
  109.             $nameResolver->addTag('kernel.event_listener', [
  110.                 'event' => $createEventName,
  111.                 'method' => 'onEvent',
  112.             ]);
  113.             $nameResolver->addTag('kernel.event_listener', [
  114.                 'event' => $updateEventName,
  115.                 'method' => 'onEvent',
  116.             ]);
  117.             $container->setDefinition(
  118.                 sprintf(
  119.                     '%s.resource.%s.doctrine.odm.phpcr.event_listener.name_resolver',
  120.                     $metadata->getApplicationName(),
  121.                     $metadata->getName()
  122.                 ),
  123.                 $nameResolver
  124.             );
  125.         }
  126.     }
  127.     /**
  128.      * {@inheritdoc}
  129.      */
  130.     public function getType(): string
  131.     {
  132.         return SyliusResourceBundle::DRIVER_DOCTRINE_PHPCR_ODM;
  133.     }
  134.     /**
  135.      * {@inheritdoc}
  136.      */
  137.     protected function addRepository(ContainerBuilder $containerMetadataInterface $metadata): void
  138.     {
  139.         $repositoryClass = new Parameter('sylius.phpcr_odm.repository.class');
  140.         if ($metadata->hasClass('repository')) {
  141.             $repositoryClass $metadata->getClass('repository');
  142.         }
  143.         $definition = new Definition($repositoryClass);
  144.         $definition->setArguments([
  145.             new Reference($metadata->getServiceId('manager')),
  146.             $this->getClassMetadataDefinition($metadata),
  147.         ]);
  148.         $container->setDefinition($metadata->getServiceId('repository'), $definition);
  149.     }
  150.     /**
  151.      * {@inheritdoc}
  152.      */
  153.     protected function getManagerServiceId(MetadataInterface $metadata): string
  154.     {
  155.         if ($objectManagerName $this->getObjectManagerName($metadata)) {
  156.             return sprintf('doctrine_phpcr.odm.%s_document_manager'$objectManagerName);
  157.         }
  158.         return 'doctrine_phpcr.odm.document_manager';
  159.     }
  160.     /**
  161.      * {@inheritdoc}
  162.      */
  163.     protected function getClassMetadataClassname(): string
  164.     {
  165.         return 'Doctrine\\ODM\\PHPCR\\Mapping\\ClassMetadata';
  166.     }
  167. }