Chris@14: Chris@14: * Chris@14: * For the full copyright and license information, please view the LICENSE Chris@14: * file that was distributed with this source code. Chris@14: */ Chris@14: Chris@14: namespace Symfony\Component\DependencyInjection\Compiler; Chris@14: Chris@14: use Symfony\Component\DependencyInjection\Argument\ArgumentInterface; Chris@14: use Symfony\Component\DependencyInjection\ContainerBuilder; Chris@14: use Symfony\Component\DependencyInjection\Definition; Chris@14: use Symfony\Component\DependencyInjection\Reference; Chris@14: Chris@14: /** Chris@14: * Propagate "container.hot_path" tags to referenced services. Chris@14: * Chris@14: * @author Nicolas Grekas
Chris@14: */ Chris@14: class ResolveHotPathPass extends AbstractRecursivePass Chris@14: { Chris@14: private $tagName; Chris@17: private $resolvedIds = []; Chris@14: Chris@14: public function __construct($tagName = 'container.hot_path') Chris@14: { Chris@14: $this->tagName = $tagName; Chris@14: } Chris@14: Chris@14: /** Chris@14: * {@inheritdoc} Chris@14: */ Chris@14: public function process(ContainerBuilder $container) Chris@14: { Chris@14: try { Chris@14: parent::process($container); Chris@14: $container->getDefinition('service_container')->clearTag($this->tagName); Chris@14: } finally { Chris@17: $this->resolvedIds = []; Chris@14: } Chris@14: } Chris@14: Chris@14: /** Chris@14: * {@inheritdoc} Chris@14: */ Chris@14: protected function processValue($value, $isRoot = false) Chris@14: { Chris@14: if ($value instanceof ArgumentInterface) { Chris@14: return $value; Chris@14: } Chris@14: if ($value instanceof Definition && $isRoot && (isset($this->resolvedIds[$this->currentId]) || !$value->hasTag($this->tagName) || $value->isDeprecated())) { Chris@14: return $value->isDeprecated() ? $value->clearTag($this->tagName) : $value; Chris@14: } Chris@14: if ($value instanceof Reference && ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior() && $this->container->has($id = $this->container->normalizeId($value))) { Chris@14: $definition = $this->container->findDefinition($id); Chris@14: if (!$definition->hasTag($this->tagName) && !$definition->isDeprecated()) { Chris@14: $this->resolvedIds[$id] = true; Chris@14: $definition->addTag($this->tagName); Chris@14: parent::processValue($definition, false); Chris@14: } Chris@14: Chris@14: return $value; Chris@14: } Chris@14: Chris@14: return parent::processValue($value, $isRoot); Chris@14: } Chris@14: }