* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Exception\NonExistentParameterException; /** * Resolves all parameter placeholders "%somevalue%" to their real values. * * @author Johannes M. Schmitt */ class ResolveParameterPlaceHoldersPass implements CompilerPassInterface { private $parameterBag; /** * Processes the ContainerBuilder to resolve parameter placeholders. * * @param ContainerBuilder $container */ public function process(ContainerBuilder $container) { $this->parameterBag = $container->getParameterBag(); foreach ($container->getDefinitions() as $id => $definition) { try { $definition->setClass($this->resolveValue($definition->getClass())); $definition->setFile($this->resolveValue($definition->getFile())); $definition->setArguments($this->resolveValue($definition->getArguments())); $calls = array(); foreach ($definition->getMethodCalls() as $name => $arguments) { $calls[$this->resolveValue($name)] = $this->resolveValue($arguments); } $definition->setMethodCalls($calls); $definition->setProperties($this->resolveValue($definition->getProperties())); } catch (NonExistentParameterException $e) { $e->setSourceId($id); throw $e; } } $aliases = array(); foreach ($container->getAliases() as $name => $target) { $aliases[$this->resolveValue($name)] = $this->resolveValue($target); } $container->setAliases($aliases); $parameterBag = $container->getParameterBag(); foreach ($parameterBag->all() as $key => $value) { try { $parameterBag->set($key, $this->resolveValue($value)); } catch (NonExistentParameterException $e) { $e->setSourceKey($key); throw $e; } } } /** * Expands parameters into their full values * * @param mixed $value The value to resolve * @return mixed The resolved value */ private function resolveValue($value) { if (is_array($value)) { $resolved = array(); foreach ($value as $k => $v) { $resolved[$this->resolveValue($k)] = $this->resolveValue($v); } return $resolved; } else if (is_string($value)) { return $this->resolveString($value); } return $value; } /** * Resolves parameters inside a string * * @param string $value The string to resolve * @return string The resolved string * @throws \RuntimeException when a given parameter has a type problem. */ public function resolveString($value) { if (preg_match('/^%[^%]+%$/', $value)) { return $this->resolveValue($this->parameterBag->resolveValue($value)); } $self = $this; $parameterBag = $this->parameterBag; return preg_replace_callback('/(?resolveValue($parameter[0]); if (!is_string($resolved)) { throw new \RuntimeException('You can only embed strings in other parameters.'); } return $self->resolveString($resolved); }, $value ); } }