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

AnalyzeServiceReferencesPass.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 4.99 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\DependencyInjection\Compiler;
 013   
 014  use Symfony\Component\DependencyInjection\Definition;
 015  use Symfony\Component\DependencyInjection\Reference;
 016  use Symfony\Component\DependencyInjection\ContainerBuilder;
 017   
 018  /**
 019   * Run this pass before passes that need to know more about the relation of
 020   * your services.
 021   *
 022   * This class will populate the ServiceReferenceGraph with information. You can
 023   * retrieve the graph in other passes from the compiler.
 024   *
 025   * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 026   */
 027  class AnalyzeServiceReferencesPass implements RepeatablePassInterface
 028  {
 029      private $graph;
 030      private $container;
 031      private $currentId;
 032      private $currentDefinition;
 033      private $repeatedPass;
 034      private $onlyConstructorArguments;
 035   
 036      /**
 037       * @param bool $onlyConstructorArguments Sets this Service Reference pass to ignore method calls
 038       */
 039      public function __construct($onlyConstructorArguments = false)
 040      {
 041          $this->onlyConstructorArguments = (bool) $onlyConstructorArguments;
 042      }
 043   
 044      /**
 045       * {@inheritdoc}
 046       */
 047      public function setRepeatedPass(RepeatedPass $repeatedPass)
 048      {
 049          $this->repeatedPass = $repeatedPass;
 050      }
 051   
 052      /**
 053       * Processes a ContainerBuilder object to populate the service reference graph.
 054       *
 055       * @param ContainerBuilder $container
 056       */
 057      public function process(ContainerBuilder $container)
 058      {
 059          $this->container = $container;
 060          $this->graph = $container->getCompiler()->getServiceReferenceGraph();
 061          $this->graph->clear();
 062   
 063          foreach ($container->getDefinitions() as $id => $definition) {
 064              if ($definition->isSynthetic() || $definition->isAbstract()) {
 065                  continue;
 066              }
 067   
 068              $this->currentId = $id;
 069              $this->currentDefinition = $definition;
 070   
 071              $this->processArguments($definition->getArguments());
 072              if ($definition->getFactoryService(false)) {
 073                  $this->processArguments(array(new Reference($definition->getFactoryService(false))));
 074              }
 075              if (is_array($definition->getFactory())) {
 076                  $this->processArguments($definition->getFactory());
 077              }
 078   
 079              if (!$this->onlyConstructorArguments) {
 080                  $this->processArguments($definition->getMethodCalls());
 081                  $this->processArguments($definition->getProperties());
 082                  if ($definition->getConfigurator()) {
 083                      $this->processArguments(array($definition->getConfigurator()));
 084                  }
 085              }
 086          }
 087   
 088          foreach ($container->getAliases() as $id => $alias) {
 089              $this->graph->connect($id, $alias, (string) $alias, $this->getDefinition((string) $alias), null);
 090          }
 091      }
 092   
 093      /**
 094       * Processes service definitions for arguments to find relationships for the service graph.
 095       *
 096       * @param array $arguments An array of Reference or Definition objects relating to service definitions
 097       */
 098      private function processArguments(array $arguments)
 099      {
 100          foreach ($arguments as $argument) {
 101              if (is_array($argument)) {
 102                  $this->processArguments($argument);
 103              } elseif ($argument instanceof Reference) {
 104                  $this->graph->connect(
 105                      $this->currentId,
 106                      $this->currentDefinition,
 107                      $this->getDefinitionId((string) $argument),
 108                      $this->getDefinition((string) $argument),
 109                      $argument
 110                  );
 111              } elseif ($argument instanceof Definition) {
 112                  $this->processArguments($argument->getArguments());
 113                  $this->processArguments($argument->getMethodCalls());
 114                  $this->processArguments($argument->getProperties());
 115   
 116                  if (is_array($argument->getFactory())) {
 117                      $this->processArguments($argument->getFactory());
 118                  }
 119                  if ($argument->getFactoryService(false)) {
 120                      $this->processArguments(array(new Reference($argument->getFactoryService(false))));
 121                  }
 122              }
 123          }
 124      }
 125   
 126      /**
 127       * Returns a service definition given the full name or an alias.
 128       *
 129       * @param string $id A full id or alias for a service definition
 130       *
 131       * @return Definition|null The definition related to the supplied id
 132       */
 133      private function getDefinition($id)
 134      {
 135          $id = $this->getDefinitionId($id);
 136   
 137          return null === $id ? null : $this->container->getDefinition($id);
 138      }
 139   
 140      private function getDefinitionId($id)
 141      {
 142          while ($this->container->hasAlias($id)) {
 143              $id = (string) $this->container->getAlias($id);
 144          }
 145   
 146          if (!$this->container->hasDefinition($id)) {
 147              return;
 148          }
 149   
 150          return $id;
 151      }
 152  }
 153