diff options
| author | Andreas Fischer <bantu@phpbb.com> | 2014-06-14 12:45:27 +0200 | 
|---|---|---|
| committer | Andreas Fischer <bantu@phpbb.com> | 2014-06-14 12:45:27 +0200 | 
| commit | 21b5a52381a6b36587bac77d4031c8e921f8be9f (patch) | |
| tree | 8efe1e020f9b35e2fc325da4287ebcf1acdc242b | |
| parent | a4c75d89706ef7a678c8914b374adcf323226913 (diff) | |
| parent | 482f60f1bd45580fe7010a5687a66dd9b0695d29 (diff) | |
| download | forums-21b5a52381a6b36587bac77d4031c8e921f8be9f.tar forums-21b5a52381a6b36587bac77d4031c8e921f8be9f.tar.gz forums-21b5a52381a6b36587bac77d4031c8e921f8be9f.tar.bz2 forums-21b5a52381a6b36587bac77d4031c8e921f8be9f.tar.xz forums-21b5a52381a6b36587bac77d4031c8e921f8be9f.zip  | |
Merge pull request #2483 from Nicofuma/ticket/12575
[ticket/12575] Use a proxy pattern in \phpbb\di\service_collection
* Nicofuma/ticket/12575:
  [ticket/12575] Use strict comparison
  [ticket/12575] Add missing property
  [ticket/12575] Usethe new header
  [ticket/12575] Fix 2 typos in comments
  [ticket/12575] Fix typos in comments
  [ticket/12575] Skip sniffer issue triggered by the solution of a php bug
  [ticket/12575] Remove  inline assignments
  [ticket/12575] Fix the tests
  [ticket/12575] Move service_collection_iterator to its own file
  [ticket/12575] Speed up load_class()
| -rw-r--r-- | phpBB/phpbb/di/service_collection.php | 47 | ||||
| -rw-r--r-- | phpBB/phpbb/di/service_collection_iterator.php | 87 | 
2 files changed, 131 insertions, 3 deletions
diff --git a/phpBB/phpbb/di/service_collection.php b/phpBB/phpbb/di/service_collection.php index 3a18644891..a8eeeab8bb 100644 --- a/phpBB/phpbb/di/service_collection.php +++ b/phpBB/phpbb/di/service_collection.php @@ -21,6 +21,11 @@ use Symfony\Component\DependencyInjection\ContainerInterface;  class service_collection extends \ArrayObject  {  	/** +	* @var \Symfony\Component\DependencyInjection\ContainerInterface +	*/ +	protected $container; + +	/**  	* Constructor  	*  	* @param ContainerInterface $container Container object @@ -31,6 +36,44 @@ class service_collection extends \ArrayObject  	}  	/** +	* {@inheritdoc} +	*/ +	public function getIterator() +	{ +		return new service_collection_iterator($this->container, $this); +	} + +	// Because of a PHP issue we have to redefine offsetExists +	// (even with a call to the parent): +	// 		https://bugs.php.net/bug.php?id=66834 +	// 		https://bugs.php.net/bug.php?id=67067 +	// But it triggers a sniffer issue that we have to skip +	// @codingStandardsIgnoreStart +	/** +	* {@inheritdoc} +	*/ +	public function offsetExists($index) +	{ +		return parent::offsetExists($index); +	} +	// @codingStandardsIgnoreEnd + +	/** +	* {@inheritdoc} +	*/ +	public function offsetGet($index) +	{ +		$task = parent::offsetGet($index); +		if ($task === null) +		{ +			$task = $this->container->get($index); +			$this->offsetSet($index, $task); +		} + +		return $task; +	} + +	/**  	* Add a service to the collection  	*  	* @param string $name The service name @@ -38,8 +81,6 @@ class service_collection extends \ArrayObject  	*/  	public function add($name)  	{ -		$task = $this->container->get($name); - -		$this->offsetSet($name, $task); +		$this->offsetSet($name, null);  	}  } diff --git a/phpBB/phpbb/di/service_collection_iterator.php b/phpBB/phpbb/di/service_collection_iterator.php new file mode 100644 index 0000000000..54aefca1f7 --- /dev/null +++ b/phpBB/phpbb/di/service_collection_iterator.php @@ -0,0 +1,87 @@ +<?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; + +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** +* Iterator which loads the services when they are requested +*/ +class service_collection_iterator extends \ArrayIterator +{ +	/** +	* @var \Symfony\Component\DependencyInjection\ContainerInterface +	*/ +	protected $container; + +	/** +	* Construct an ArrayIterator for service_collection +	* +	* @param ContainerInterface $container Container object +	* @param array $array The array or object to be iterated on. +	* @param int $flags Flags to control the behaviour of the ArrayObject object. +	* @see ArrayObject::setFlags() +	*/ +	public function __construct(ContainerInterface $container, $array = array(), $flags = 0) +	{ +		parent::__construct($array, $flags); +		$this->container = $container; +	} + +	/** +	* {@inheritdoc} +	*/ +	public function offsetGet($index) +	{ +		$task = parent::offsetGet($index); +		if ($task === null) +		{ +			$task = $this->container->get($index); +			$this->offsetSet($index, $task); +		} + +		return $task; +	} + +	// Because of a PHP issue we have to redefine offsetExists +	// (even with a call to the parent): +	// 		https://bugs.php.net/bug.php?id=66834 +	// 		https://bugs.php.net/bug.php?id=67067 +	// But it triggers a sniffer issue that we have to skip +	// @codingStandardsIgnoreStart +	/** +	* {@inheritdoc} +	*/ +	public function offsetExists($index) +	{ +		parent::offsetExists($index); +	} +	// @codingStandardsIgnoreEnd + +	/** +	* {@inheritdoc} +	*/ +	public function current() +	{ +		$task = parent::current(); +		if ($task === null) +		{ +			$name = $this->key(); +			$task = $this->container->get($name); +			$this->offsetSet($name, $task); +		} + +		return $task; +	} +}  | 
