Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

RegisterListenersPass.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 4.34 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\EventDispatcher\DependencyInjection;
013   
014  use Symfony\Component\DependencyInjection\ContainerBuilder;
015  use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
016   
017  /**
018   * Compiler pass to register tagged services for an event dispatcher.
019   */
020  class RegisterListenersPass implements CompilerPassInterface
021  {
022      /**
023       * @var string
024       */
025      protected $dispatcherService;
026   
027      /**
028       * @var string
029       */
030      protected $listenerTag;
031   
032      /**
033       * @var string
034       */
035      protected $subscriberTag;
036   
037      /**
038       * Constructor.
039       *
040       * @param string $dispatcherService Service name of the event dispatcher in processed container
041       * @param string $listenerTag       Tag name used for listener
042       * @param string $subscriberTag     Tag name used for subscribers
043       */
044      public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber')
045      {
046          $this->dispatcherService = $dispatcherService;
047          $this->listenerTag = $listenerTag;
048          $this->subscriberTag = $subscriberTag;
049      }
050   
051      public function process(ContainerBuilder $container)
052      {
053          if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) {
054              return;
055          }
056   
057          $definition = $container->findDefinition($this->dispatcherService);
058   
059          foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) {
060              $def = $container->getDefinition($id);
061              if (!$def->isPublic()) {
062                  throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event listeners are lazy-loaded.', $id));
063              }
064   
065              if ($def->isAbstract()) {
066                  throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id));
067              }
068   
069              foreach ($events as $event) {
070                  $priority = isset($event['priority']) ? $event['priority'] : 0;
071   
072                  if (!isset($event['event'])) {
073                      throw new \InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag));
074                  }
075   
076                  if (!isset($event['method'])) {
077                      $event['method'] = 'on'.preg_replace_callback(array(
078                          '/(?<=\b)[a-z]/i',
079                          '/[^a-z0-9]/i',
080                      ), function ($matches) { return strtoupper($matches[0]); }, $event['event']);
081                      $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);
082                  }
083   
084                  $definition->addMethodCall('addListenerService', array($event['event'], array($id, $event['method']), $priority));
085              }
086          }
087   
088          foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {
089              $def = $container->getDefinition($id);
090              if (!$def->isPublic()) {
091                  throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id));
092              }
093   
094              if ($def->isAbstract()) {
095                  throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id));
096              }
097   
098              // We must assume that the class value has been correctly filled, even if the service is created by a factory
099              $class = $container->getParameterBag()->resolveValue($def->getClass());
100              $interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface';
101   
102              if (!is_subclass_of($class, $interface)) {
103                  if (!class_exists($class, false)) {
104                      throw new \InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
105                  }
106   
107                  throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
108              }
109   
110              $definition->addMethodCall('addSubscriberService', array($id, $class));
111          }
112      }
113  }
114