class RegisterListenersPass

Compiler pass to register tagged services for an event dispatcher.

Hierarchy

Expanded class hierarchy of RegisterListenersPass

1 file declares its use of RegisterListenersPass
RegisterListenersPassTest.php in drupal/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php

File

drupal/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php, line 20

Namespace

Symfony\Component\HttpKernel\DependencyInjection
View source
class RegisterListenersPass implements CompilerPassInterface {

  /**
   * @var string
   */
  protected $dispatcherService;

  /**
   * @var string
   */
  protected $listenerTag;

  /**
   * @var string
   */
  protected $subscriberTag;

  /**
   * Constructor.
   *
   * @param string $dispatcherService Service name of the event dispatcher in processed container
   * @param string $listenerTag       Tag name used for listener
   * @param string $subscriberTag     Tag name used for subscribers
   */
  public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber') {
    $this->dispatcherService = $dispatcherService;
    $this->listenerTag = $listenerTag;
    $this->subscriberTag = $subscriberTag;
  }
  public function process(ContainerBuilder $container) {
    if (!$container
      ->hasDefinition($this->dispatcherService)) {
      return;
    }
    $definition = $container
      ->getDefinition($this->dispatcherService);
    foreach ($container
      ->findTaggedServiceIds($this->listenerTag) as $id => $events) {
      foreach ($events as $event) {
        $priority = isset($event['priority']) ? $event['priority'] : 0;
        if (!isset($event['event'])) {
          throw new \InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "kernel.event_listener" tags.', $id));
        }
        if (!isset($event['method'])) {
          $event['method'] = 'on' . preg_replace_callback(array(
            '/(?<=\\b)[a-z]/i',
            '/[^a-z0-9]/i',
          ), function ($matches) {
            return strtoupper($matches[0]);
          }, $event['event']);
          $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);
        }
        $definition
          ->addMethodCall('addListenerService', array(
          $event['event'],
          array(
            $id,
            $event['method'],
          ),
          $priority,
        ));
      }
    }
    foreach ($container
      ->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {

      // We must assume that the class value has been correctly filled, even if the service is created by a factory
      $class = $container
        ->getDefinition($id)
        ->getClass();
      $refClass = new \ReflectionClass($class);
      $interface = 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface';
      if (!$refClass
        ->implementsInterface($interface)) {
        throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
      }
      $definition
        ->addMethodCall('addSubscriberService', array(
        $id,
        $class,
      ));
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
RegisterListenersPass::$dispatcherService protected property
RegisterListenersPass::$listenerTag protected property
RegisterListenersPass::$subscriberTag protected property
RegisterListenersPass::process public function You can modify the container here before it is dumped to PHP code. Overrides CompilerPassInterface::process
RegisterListenersPass::__construct public function Constructor.