[ Index ]

PHP Cross Reference of phpBB-3.1.12-deutsch

title

Body

[close]

/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ -> RegisterListenersPass.php (source)

   1  <?php
   2  
   3  /*
   4   * This file is part of the Symfony package.
   5   *
   6   * (c) Fabien Potencier <fabien@symfony.com>
   7   *
   8   * For the full copyright and license information, please view the LICENSE
   9   * file that was distributed with this source code.
  10   */
  11  
  12  namespace Symfony\Component\HttpKernel\DependencyInjection;
  13  
  14  use Symfony\Component\DependencyInjection\ContainerBuilder;
  15  use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
  16  
  17  /**
  18   * Compiler pass to register tagged services for an event dispatcher.
  19   */
  20  class RegisterListenersPass implements CompilerPassInterface
  21  {
  22      /**
  23       * @var string
  24       */
  25      protected $dispatcherService;
  26  
  27      /**
  28       * @var string
  29       */
  30      protected $listenerTag;
  31  
  32      /**
  33       * @var string
  34       */
  35      protected $subscriberTag;
  36  
  37      /**
  38       * Constructor.
  39       *
  40       * @param string $dispatcherService Service name of the event dispatcher in processed container
  41       * @param string $listenerTag       Tag name used for listener
  42       * @param string $subscriberTag     Tag name used for subscribers
  43       */
  44      public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber')
  45      {
  46          $this->dispatcherService = $dispatcherService;
  47          $this->listenerTag = $listenerTag;
  48          $this->subscriberTag = $subscriberTag;
  49      }
  50  
  51      public function process(ContainerBuilder $container)
  52      {
  53          if (!$container->hasDefinition($this->dispatcherService)) {
  54              return;
  55          }
  56  
  57          $definition = $container->getDefinition($this->dispatcherService);
  58  
  59          foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) {
  60              $def = $container->getDefinition($id);
  61              if (!$def->isPublic()) {
  62                  throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event listeners are lazy-loaded.', $id));
  63              }
  64  
  65              if ($def->isAbstract()) {
  66                  throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id));
  67              }
  68  
  69              foreach ($events as $event) {
  70                  $priority = isset($event['priority']) ? $event['priority'] : 0;
  71  
  72                  if (!isset($event['event'])) {
  73                      throw new \InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag));
  74                  }
  75  
  76                  if (!isset($event['method'])) {
  77                      $event['method'] = 'on'.preg_replace_callback(array(
  78                          '/(?<=\b)[a-z]/i',
  79                          '/[^a-z0-9]/i',
  80                      ), function ($matches) { return strtoupper($matches[0]); }, $event['event']);
  81                      $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);
  82                  }
  83  
  84                  $definition->addMethodCall('addListenerService', array($event['event'], array($id, $event['method']), $priority));
  85              }
  86          }
  87  
  88          foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {
  89              $def = $container->getDefinition($id);
  90              if (!$def->isPublic()) {
  91                  throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id));
  92              }
  93  
  94              if ($def->isAbstract()) {
  95                  throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id));
  96              }
  97  
  98              // We must assume that the class value has been correctly filled, even if the service is created by a factory
  99              $class = $container->getParameterBag()->resolveValue($def->getClass());
 100  
 101              $refClass = new \ReflectionClass($class);
 102              $interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface';
 103              if (!$refClass->implementsInterface($interface)) {
 104                  throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
 105              }
 106  
 107              $definition->addMethodCall('addSubscriberService', array($id, $class));
 108          }
 109      }
 110  }


Generated: Thu Jan 11 00:25:41 2018 Cross-referenced by PHPXref 0.7.1