diff options
Diffstat (limited to 'lib/private/appframework/utility/simplecontainer.php')
-rw-r--r-- | lib/private/appframework/utility/simplecontainer.php | 85 |
1 files changed, 84 insertions, 1 deletions
diff --git a/lib/private/appframework/utility/simplecontainer.php b/lib/private/appframework/utility/simplecontainer.php index 55b9cf7a977..68d52d759e0 100644 --- a/lib/private/appframework/utility/simplecontainer.php +++ b/lib/private/appframework/utility/simplecontainer.php @@ -1,7 +1,29 @@ <?php +/** + * ownCloud - App Framework + * + * @author Bernhard Posselt + * @copyright 2014 Bernhard Posselt <dev@bernhard-posselt.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ namespace OC\AppFramework\Utility; +use \OCP\AppFramework\QueryException; + /** * Class SimpleContainer * @@ -9,12 +31,71 @@ namespace OC\AppFramework\Utility; */ class SimpleContainer extends \Pimple\Container implements \OCP\IContainer { + + /** + * @param ReflectionClass $class the class to instantiate + * @return stdClass the created class + */ + private function buildClass(\ReflectionClass $class) { + $constructor = $class->getConstructor(); + if ($constructor === null) { + return $class->newInstance(); + } else { + $parameters = []; + foreach ($constructor->getParameters() as $parameter) { + $parameterClass = $parameter->getClass(); + + // try to find out if it is a class or a simple parameter + if ($parameterClass === null) { + $resolveName = $parameter->getName(); + } else { + $resolveName = $parameterClass->name; + } + + $parameters[] = $this->query($resolveName); + } + return $class->newInstanceArgs($parameters); + } + } + + + /** + * If a parameter is not registered in the container try to instantiate it + * by using reflection to find out how to build the class + * @param string $name the class name to resolve + * @throws QueryException if the class could not be found or instantiated + */ + private function resolve($name) { + $baseMsg = 'Could not resolve ' . $name . '!'; + try { + $class = new \ReflectionClass($name); + if ($class->isInstantiable()) { + return $this->buildClass($class); + } else { + throw new QueryException($baseMsg . + ' Class can not be instantiated'); + } + } catch(\ReflectionException $e) { + throw new QueryException($baseMsg . ' ' . $e->getMessage()); + } + } + + /** * @param string $name name of the service to query for * @return mixed registered service for the given $name + * @throws QueryExcpetion if the query could not be resolved */ public function query($name) { - return $this->offsetGet($name); + if ($this->offsetExists($name)) { + return $this->offsetGet($name); + } else { + $object = $this->resolve($name); + $this->registerService($name, function () use ($object) { + return $object; + }); + return $object; + } } /** @@ -44,4 +125,6 @@ class SimpleContainer extends \Pimple\Container implements \OCP\IContainer { $this[$name] = parent::factory($closure); } } + + } |