diff options
author | Mate Bartus <mate.bartus@gmail.com> | 2015-06-24 13:08:19 +0200 |
---|---|---|
committer | Mate Bartus <mate.bartus@gmail.com> | 2015-06-24 13:08:19 +0200 |
commit | a91c4e4f96309401f2e1a7a05ccadc876781298e (patch) | |
tree | cb7183524d389f01de45d7b3d53721e7c74fc10d /phpBB/phpbb/di | |
parent | 9dbd8f4f9b1c8a9edd0d1734c2c61b7360d54836 (diff) | |
download | forums-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.php | 11 | ||||
-rw-r--r-- | phpBB/phpbb/di/service_collection/ordered_service_collection.php | 108 |
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; + } +} |