diff vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * 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\Alias;
+
+/**
+ * Overwrites a service but keeps the overridden one.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Diego Saint Esteben <diego@saintesteben.me>
+ */
+class DecoratorServicePass implements CompilerPassInterface
+{
+    public function process(ContainerBuilder $container)
+    {
+        $definitions = new \SplPriorityQueue();
+        $order = PHP_INT_MAX;
+
+        foreach ($container->getDefinitions() as $id => $definition) {
+            if (!$decorated = $definition->getDecoratedService()) {
+                continue;
+            }
+            $definitions->insert(array($id, $definition), array($decorated[2], --$order));
+        }
+
+        foreach ($definitions as list($id, $definition)) {
+            list($inner, $renamedId) = $definition->getDecoratedService();
+
+            $definition->setDecoratedService(null);
+
+            if (!$renamedId) {
+                $renamedId = $id.'.inner';
+            }
+
+            // we create a new alias/service for the service we are replacing
+            // to be able to reference it in the new one
+            if ($container->hasAlias($inner)) {
+                $alias = $container->getAlias($inner);
+                $public = $alias->isPublic();
+                $container->setAlias($renamedId, new Alias((string) $alias, false));
+            } else {
+                $decoratedDefinition = $container->getDefinition($inner);
+                $definition->setTags(array_merge($decoratedDefinition->getTags(), $definition->getTags()));
+                $definition->setAutowiringTypes(array_merge($decoratedDefinition->getAutowiringTypes(), $definition->getAutowiringTypes()));
+                $public = $decoratedDefinition->isPublic();
+                $decoratedDefinition->setPublic(false);
+                $decoratedDefinition->setTags(array());
+                $decoratedDefinition->setAutowiringTypes(array());
+                $container->setDefinition($renamedId, $decoratedDefinition);
+            }
+
+            $container->setAlias($inner, new Alias($id, $public));
+        }
+    }
+}