vendor/symfony/dependency-injection/Compiler/Compiler.php line 95

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\DependencyInjection\Compiler;
  11. use Symfony\Component\DependencyInjection\ContainerBuilder;
  12. use Symfony\Component\DependencyInjection\Exception\EnvParameterException;
  13. /**
  14.  * This class is used to remove circular dependencies between individual passes.
  15.  *
  16.  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
  17.  */
  18. class Compiler
  19. {
  20.     private $passConfig;
  21.     private $log = [];
  22.     private $serviceReferenceGraph;
  23.     public function __construct()
  24.     {
  25.         $this->passConfig = new PassConfig();
  26.         $this->serviceReferenceGraph = new ServiceReferenceGraph();
  27.     }
  28.     /**
  29.      * Returns the PassConfig.
  30.      *
  31.      * @return PassConfig The PassConfig instance
  32.      */
  33.     public function getPassConfig()
  34.     {
  35.         return $this->passConfig;
  36.     }
  37.     /**
  38.      * Returns the ServiceReferenceGraph.
  39.      *
  40.      * @return ServiceReferenceGraph The ServiceReferenceGraph instance
  41.      */
  42.     public function getServiceReferenceGraph()
  43.     {
  44.         return $this->serviceReferenceGraph;
  45.     }
  46.     /**
  47.      * Adds a pass to the PassConfig.
  48.      *
  49.      * @param CompilerPassInterface $pass     A compiler pass
  50.      * @param string                $type     The type of the pass
  51.      * @param int                   $priority Used to sort the passes
  52.      */
  53.     public function addPass(CompilerPassInterface $pass$type PassConfig::TYPE_BEFORE_OPTIMIZATIONint $priority 0)
  54.     {
  55.         $this->passConfig->addPass($pass$type$priority);
  56.     }
  57.     /**
  58.      * @final
  59.      */
  60.     public function log(CompilerPassInterface $passstring $message)
  61.     {
  62.         if (false !== strpos($message"\n")) {
  63.             $message str_replace("\n""\n".\get_class($pass).': 'trim($message));
  64.         }
  65.         $this->log[] = \get_class($pass).': '.$message;
  66.     }
  67.     /**
  68.      * Returns the log.
  69.      *
  70.      * @return array Log array
  71.      */
  72.     public function getLog()
  73.     {
  74.         return $this->log;
  75.     }
  76.     /**
  77.      * Run the Compiler and process all Passes.
  78.      */
  79.     public function compile(ContainerBuilder $container)
  80.     {
  81.         try {
  82.             foreach ($this->passConfig->getPasses() as $pass) {
  83.                 $pass->process($container);
  84.             }
  85.         } catch (\Exception $e) {
  86.             $usedEnvs = [];
  87.             $prev $e;
  88.             do {
  89.                 $msg $prev->getMessage();
  90.                 if ($msg !== $resolvedMsg $container->resolveEnvPlaceholders($msgnull$usedEnvs)) {
  91.                     $r = new \ReflectionProperty($prev'message');
  92.                     $r->setAccessible(true);
  93.                     $r->setValue($prev$resolvedMsg);
  94.                 }
  95.             } while ($prev $prev->getPrevious());
  96.             if ($usedEnvs) {
  97.                 $e = new EnvParameterException($usedEnvs$e);
  98.             }
  99.             throw $e;
  100.         } finally {
  101.             $this->getServiceReferenceGraph()->clear();
  102.         }
  103.     }
  104. }