namespace Symfony\Component\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\EnvParameterException;
/**
* This class is used to remove circular dependencies between individual passes.
{
$this->passConfig = new PassConfig();
$this->serviceReferenceGraph = new ServiceReferenceGraph();
- $this->loggingFormatter = new LoggingFormatter();
}
/**
* Returns the logging formatter which can be used by compilation passes.
*
* @return LoggingFormatter
+ *
+ * @deprecated since version 3.3, to be removed in 4.0. Use the ContainerBuilder::log() method instead.
*/
public function getLoggingFormatter()
{
+ if (null === $this->loggingFormatter) {
+ @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the ContainerBuilder::log() method instead.', __METHOD__), E_USER_DEPRECATED);
+
+ $this->loggingFormatter = new LoggingFormatter();
+ }
+
return $this->loggingFormatter;
}
/**
* Adds a pass to the PassConfig.
*
- * @param CompilerPassInterface $pass A compiler pass
- * @param string $type The type of the pass
+ * @param CompilerPassInterface $pass A compiler pass
+ * @param string $type The type of the pass
+ * @param int $priority Used to sort the passes
*/
- public function addPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION)
+ public function addPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION/*, int $priority = 0*/)
{
- $this->passConfig->addPass($pass, $type);
+ if (\func_num_args() >= 3) {
+ $priority = func_get_arg(2);
+ } else {
+ if (__CLASS__ !== \get_class($this)) {
+ $r = new \ReflectionMethod($this, __FUNCTION__);
+ if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
+ @trigger_error(sprintf('Method %s() will have a third `int $priority = 0` argument in version 4.0. Not defining it is deprecated since Symfony 3.2.', __METHOD__), E_USER_DEPRECATED);
+ }
+ }
+
+ $priority = 0;
+ }
+
+ $this->passConfig->addPass($pass, $type, $priority);
}
/**
* Adds a log message.
*
* @param string $string The log message
+ *
+ * @deprecated since version 3.3, to be removed in 4.0. Use the ContainerBuilder::log() method instead.
*/
public function addLogMessage($string)
{
+ @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the ContainerBuilder::log() method instead.', __METHOD__), E_USER_DEPRECATED);
+
$this->log[] = $string;
}
+ /**
+ * @final
+ */
+ public function log(CompilerPassInterface $pass, $message)
+ {
+ if (false !== strpos($message, "\n")) {
+ $message = str_replace("\n", "\n".\get_class($pass).': ', trim($message));
+ }
+
+ $this->log[] = \get_class($pass).': '.$message;
+ }
+
/**
* Returns the log.
*
/**
* Run the Compiler and process all Passes.
- *
- * @param ContainerBuilder $container
*/
public function compile(ContainerBuilder $container)
{
- foreach ($this->passConfig->getPasses() as $pass) {
- $pass->process($container);
+ try {
+ foreach ($this->passConfig->getPasses() as $pass) {
+ $pass->process($container);
+ }
+ } catch (\Exception $e) {
+ $usedEnvs = array();
+ $prev = $e;
+
+ do {
+ $msg = $prev->getMessage();
+
+ if ($msg !== $resolvedMsg = $container->resolveEnvPlaceholders($msg, null, $usedEnvs)) {
+ $r = new \ReflectionProperty($prev, 'message');
+ $r->setAccessible(true);
+ $r->setValue($prev, $resolvedMsg);
+ }
+ } while ($prev = $prev->getPrevious());
+
+ if ($usedEnvs) {
+ $e = new EnvParameterException($usedEnvs, $e);
+ }
+
+ throw $e;
+ } finally {
+ $this->getServiceReferenceGraph()->clear();
}
}
}