aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/di
diff options
context:
space:
mode:
authorMate Bartus <mate.bartus@gmail.com>2015-06-24 13:08:19 +0200
committerMate Bartus <mate.bartus@gmail.com>2015-06-24 13:08:19 +0200
commita91c4e4f96309401f2e1a7a05ccadc876781298e (patch)
treecb7183524d389f01de45d7b3d53721e7c74fc10d /phpBB/phpbb/di
parent9dbd8f4f9b1c8a9edd0d1734c2c61b7360d54836 (diff)
downloadforums-a91c4e4f96309401f2e1a7a05ccadc876781298e.tar
forums-a91c4e4f96309401f2e1a7a05ccadc876781298e.tar.gz
forums-a91c4e4f96309401f2e1a7a05ccadc876781298e.tar.bz2
forums-a91c4e4f96309401f2e1a7a05ccadc876781298e.tar.xz
forums-a91c4e4f96309401f2e1a7a05ccadc876781298e.zip
[ticket/13961] Add ordered service collection
PHPBB3-13961
Diffstat (limited to 'phpBB/phpbb/di')
-rw-r--r--phpBB/phpbb/di/pass/collection_pass.php11
-rw-r--r--phpBB/phpbb/di/service_collection/ordered_service_collection.php108
2 files changed, 118 insertions, 1 deletions
diff --git a/phpBB/phpbb/di/pass/collection_pass.php b/phpBB/phpbb/di/pass/collection_pass.php
index a5c054674e..ccc1250c20 100644
--- a/phpBB/phpbb/di/pass/collection_pass.php
+++ b/phpBB/phpbb/di/pass/collection_pass.php
@@ -37,7 +37,16 @@ class collection_pass implements CompilerPassInterface
foreach ($container->findTaggedServiceIds($data[0]['tag']) as $service_id => $service_data)
{
- $definition->addMethodCall('add', array($service_id));
+ if (substr($definition->getClass(), -strlen('ordered_service_collection')) === 'ordered_service_collection')
+ {
+ $arguments = array($service_id, $service_data[0]['order']);
+ }
+ else
+ {
+ $arguments = array($service_id);
+ }
+
+ $definition->addMethodCall('add', $arguments);
}
}
}
diff --git a/phpBB/phpbb/di/service_collection/ordered_service_collection.php b/phpBB/phpbb/di/service_collection/ordered_service_collection.php
new file mode 100644
index 0000000000..01d0914ad4
--- /dev/null
+++ b/phpBB/phpbb/di/service_collection/ordered_service_collection.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\di\service_collection;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Collection of services in a specified order
+ */
+class ordered_service_collection extends service_collection
+{
+ /**
+ * @var bool
+ */
+ protected $is_ordered;
+
+ /**
+ * @var array
+ */
+ protected $service_ids;
+
+ /**
+ * Constructor
+ *
+ * @param ContainerInterface $container Container object
+ */
+ public function __construct(ContainerInterface $container)
+ {
+ $this->is_ordered = false;
+ $this->service_ids = array();
+
+ parent::__construct($container);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function offsetExists($index)
+ {
+ if (!$this->is_ordered)
+ {
+ $this->sort_services();
+ }
+
+ return parent::offsetExists($index);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function offsetGet($index)
+ {
+ if (!$this->is_ordered)
+ {
+ $this->sort_services();
+ }
+
+ return parent::offsetGet($index);
+ }
+
+ /**
+ * Adds a service ID to the collection
+ *
+ * @param string $service_id
+ * @param int $order
+ */
+ public function add($service_id, $order)
+ {
+ if ($this->is_ordered)
+ {
+ return;
+ }
+
+ $order = (int) $order;
+
+ $this->service_ids[$order][] = $service_id;
+ }
+
+ protected function sort_services()
+ {
+ if ($this->is_ordered)
+ {
+ return;
+ }
+
+ ksort($this->service_ids);
+ foreach ($this->service_ids as $service_order_group)
+ {
+ foreach ($service_order_group as $service_id)
+ {
+ $this->offsetSet($service_id, null);
+ }
+ }
+
+ $this->is_ordered = true;
+ }
+}