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.     public function load(ContainerBuilder $containerMetadataInterface $metadata): void
  26.     {
  27.         parent::load($container$metadata);
  28.         $this->addResourceListeners($container$metadata);
  29.     }
  30.     protected function addResourceListeners(ContainerBuilder $containerMetadataInterface $metadata): void
  31.     {
  32.         $defaultOptions = [
  33.                 // if no parent is given default to the parent path given here.
  34.                 'parent_path_default' => null,
  35.                 // auto-create the parent path if it does not exist.
  36.                 'parent_path_autocreate' => false,
  37.                 // set true to always override the parent path.
  38.                 'parent_path_force' => false,
  39.                 // automatically replace invalid characters in the node name
  40.                 // with a blank space.
  41.                 'name_filter' => true,
  42.                 // automatically resolve same-name-sibling conflicts.
  43.                 'name_resolver' => true,
  44.         ];
  45.         $metadataOptions $metadata->hasParameter('options') ? $metadata->getParameter('options') : [];
  46.         if ($diff array_diff(array_keys($metadataOptions), array_keys($defaultOptions))) {
  47.             throw new InvalidArgumentException(sprintf(
  48.                 'Unknown PHPCR-ODM configuration options: "%s"',
  49.                 implode('", "'$diff)
  50.             ));
  51.         }
  52.         $options array_merge(
  53.             $defaultOptions,
  54.             $metadataOptions
  55.         );
  56.         $createEventName sprintf('%s.%s.pre_%s'$metadata->getApplicationName(), $metadata->getName(), 'create');
  57.         $updateEventName sprintf('%s.%s.pre_%s'$metadata->getApplicationName(), $metadata->getName(), 'update');
  58.         if ($options['parent_path_default']) {
  59.             $defaultPath = new Definition(DefaultParentListener::class);
  60.             $defaultPath->setArguments([
  61.                 new Reference($metadata->getServiceId('manager')),
  62.                 $options['parent_path_default'],
  63.                 $options['parent_path_autocreate'],
  64.                 $options['parent_path_force'],
  65.             ]);
  66.             $defaultPath->addTag('kernel.event_listener', [
  67.                 'event' => $createEventName,
  68.                 'method' => 'onPreCreate',
  69.             ]);
  70.             $container->setDefinition(
  71.                 sprintf(
  72.                     '%s.resource.%s.doctrine.odm.phpcr.event_listener.default_path',
  73.                     $metadata->getApplicationName(),
  74.                     $metadata->getName()
  75.                 ),
  76.                 $defaultPath
  77.             );
  78.         }
  79.         if ($options['name_filter']) {
  80.             $nameFilter = new Definition(NameFilterListener::class);
  81.             $nameFilter->setArguments([
  82.                 new Reference($metadata->getServiceId('manager')),
  83.             ]);
  84.             $nameFilter->addTag('kernel.event_listener', [
  85.                 'event' => $createEventName,
  86.                 'method' => 'onEvent',
  87.             ]);
  88.             $nameFilter->addTag('kernel.event_listener', [
  89.                 'event' => $updateEventName,
  90.                 'method' => 'onEvent',
  91.             ]);
  92.             $container->setDefinition(
  93.                 sprintf(
  94.                     '%s.resource.%s.doctrine.odm.phpcr.event_listener.name_filter',
  95.                     $metadata->getApplicationName(),
  96.                     $metadata->getName()
  97.                 ),
  98.                 $nameFilter
  99.             );
  100.         }
  101.         if ($options['name_resolver']) {
  102.             $nameResolver = new Definition(NameResolverListener::class);
  103.             $nameResolver->setArguments([
  104.                 new Reference($metadata->getServiceId('manager')),
  105.             ]);
  106.             $nameResolver->addTag('kernel.event_listener', [
  107.                 'event' => $createEventName,
  108.                 'method' => 'onEvent',
  109.             ]);
  110.             $nameResolver->addTag('kernel.event_listener', [
  111.                 'event' => $updateEventName,
  112.                 'method' => 'onEvent',
  113.             ]);
  114.             $container->setDefinition(
  115.                 sprintf(
  116.                     '%s.resource.%s.doctrine.odm.phpcr.event_listener.name_resolver',
  117.                     $metadata->getApplicationName(),
  118.                     $metadata->getName()
  119.                 ),
  120.                 $nameResolver
  121.             );
  122.         }
  123.     }
  124.     public function getType(): string
  125.     {
  126.         return SyliusResourceBundle::DRIVER_DOCTRINE_PHPCR_ODM;
  127.     }
  128.     protected function addRepository(ContainerBuilder $containerMetadataInterface $metadata): void
  129.     {
  130.         $repositoryClass = new Parameter('sylius.phpcr_odm.repository.class');
  131.         if ($metadata->hasClass('repository')) {
  132.             $repositoryClass $metadata->getClass('repository');
  133.         }
  134.         $definition = new Definition($repositoryClass);
  135.         $definition->setArguments([
  136.             new Reference($metadata->getServiceId('manager')),
  137.             $this->getClassMetadataDefinition($metadata),
  138.         ]);
  139.         $container->setDefinition($metadata->getServiceId('repository'), $definition);
  140.     }
  141.     protected function getManagerServiceId(MetadataInterface $metadata): string
  142.     {
  143.         if ($objectManagerName $this->getObjectManagerName($metadata)) {
  144.             return sprintf('doctrine_phpcr.odm.%s_document_manager'$objectManagerName);
  145.         }
  146.         return 'doctrine_phpcr.odm.document_manager';
  147.     }
  148.     protected function getClassMetadataClassname(): string
  149.     {
  150.         return 'Doctrine\\ODM\\PHPCR\\Mapping\\ClassMetadata';
  151.     }
  152. }