diff options
author | Igor Scheller <igor.scheller@igorshp.de> | 2017-08-31 17:30:54 +0200 |
---|---|---|
committer | Igor Scheller <igor.scheller@igorshp.de> | 2017-08-31 17:30:54 +0200 |
commit | 8c81adc8e83969e90b4c54daf4a396b1094134ff (patch) | |
tree | ae5b7e5bd826a9287d8fa34627d5b67c58e6fb22 /src | |
parent | 0a20883aa862779b48fd2a297456c2db04cffb95 (diff) |
Implemented container
Diffstat (limited to 'src')
-rw-r--r-- | src/Config/Config.php | 28 | ||||
-rw-r--r-- | src/Container/Container.php | 105 | ||||
-rw-r--r-- | src/Container/ContainerException.php | 11 | ||||
-rw-r--r-- | src/Container/NotFoundException.php | 10 | ||||
-rw-r--r-- | src/Http/Request.php | 25 | ||||
-rw-r--r-- | src/Renderer/Renderer.php | 24 | ||||
-rw-r--r-- | src/Routing/UrlGenerator.php | 4 | ||||
-rw-r--r-- | src/helpers.php | 29 |
8 files changed, 152 insertions, 84 deletions
diff --git a/src/Config/Config.php b/src/Config/Config.php index 02080de4..34c21a78 100644 --- a/src/Config/Config.php +++ b/src/Config/Config.php @@ -2,16 +2,9 @@ namespace Engelsystem\Config; -use ErrorException; - class Config { /** - * @var self - */ - protected static $instance; - - /** * The config values * * @var array @@ -104,25 +97,4 @@ class Config { $this->remove($key); } - - /** - * @return Config - * @throws ErrorException - */ - public static function getInstance() - { - if (!self::$instance instanceof self) { - throw new ErrorException('Config not initialized'); - } - - return self::$instance; - } - - /** - * @param self $instance - */ - public static function setInstance($instance) - { - self::$instance = $instance; - } } diff --git a/src/Container/Container.php b/src/Container/Container.php new file mode 100644 index 00000000..df2f92fe --- /dev/null +++ b/src/Container/Container.php @@ -0,0 +1,105 @@ +<?php + +namespace Engelsystem\Container; + +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; +use Psr\Container\NotFoundExceptionInterface; + +class Container implements ContainerInterface +{ + /** + * The globally available container + * + * @var static + */ + protected static $instance; + + /** + * Contains the shared instances + * + * @var mixed[] + */ + protected $instances = []; + + /** + * Finds an entry of the container by its identifier and returns it + * + * @param string $id Identifier of the entry to look for + * + * @throws NotFoundExceptionInterface No entry was found for **this** identifier + * @throws ContainerExceptionInterface Error while retrieving the entry + * + * @return mixed Entry + */ + public function get($id) + { + if ($this->has($id)) { + return $this->resolve($id); + } + + throw new NotFoundException(sprintf('The entry with the id "%s" could not be found')); + } + + /** + * Register a shared entry in the container + * + * @param string $abstract Identifier of the entry to set + * @param mixed $instance Entry + */ + public function instance($abstract, $instance) + { + $this->instances[$abstract] = $instance; + } + + /** + * Returns true if the container can return an entry for the given identifier + * Returns false otherwise + * + * `has($id)` returning true does not mean that `get($id)` will not throw an exception + * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface` + * + * @param string $id Identifier of the entry to look for + * + * @return bool + */ + public function has($id) + { + return isset($this->instances[$id]); + } + + /** + * Get the globally available instance of the container + * + * @return Container + */ + public static function getInstance() + { + if (is_null(static::$instance)) { + static::$instance = new static; + } + + return static::$instance; + } + + /** + * Set the globally available instance of the container + * + * @param Container $container + */ + public static function setInstance(Container $container) + { + static::$instance = $container; + } + + /** + * Resolve the requested object + * + * @param string $abstract + * @return mixed + */ + protected function resolve($abstract) + { + return $this->instances[$abstract]; + } +} diff --git a/src/Container/ContainerException.php b/src/Container/ContainerException.php new file mode 100644 index 00000000..3cdde506 --- /dev/null +++ b/src/Container/ContainerException.php @@ -0,0 +1,11 @@ +<?php + +namespace Engelsystem\Container; + +use Exception; +use Psr\Container\ContainerExceptionInterface; + +class ContainerException extends Exception implements ContainerExceptionInterface +{ + +} diff --git a/src/Container/NotFoundException.php b/src/Container/NotFoundException.php new file mode 100644 index 00000000..a83be0b1 --- /dev/null +++ b/src/Container/NotFoundException.php @@ -0,0 +1,10 @@ +<?php + +namespace Engelsystem\Container; + +use Psr\Container\NotFoundExceptionInterface; + +class NotFoundException extends ContainerException implements NotFoundExceptionInterface +{ + +} diff --git a/src/Http/Request.php b/src/Http/Request.php index f0235d45..e7850c8b 100644 --- a/src/Http/Request.php +++ b/src/Http/Request.php @@ -2,14 +2,10 @@ namespace Engelsystem\Http; -use ErrorException; use Symfony\Component\HttpFoundation\Request as SymfonyRequest; class Request extends SymfonyRequest { - /** @var self */ - protected static $instance; - /** * Get POST input * @@ -68,25 +64,4 @@ class Request extends SymfonyRequest { return rtrim(preg_replace('/\?.*/', '', $this->getUri()), '/'); } - - /** - * @return self - * @throws ErrorException - */ - public static function getInstance() - { - if (!self::$instance instanceof self) { - throw new ErrorException('Request not initialized'); - } - - return self::$instance; - } - - /** - * @param self $instance - */ - public static function setInstance($instance) - { - self::$instance = $instance; - } } diff --git a/src/Renderer/Renderer.php b/src/Renderer/Renderer.php index bf3d5609..5ed7cf31 100644 --- a/src/Renderer/Renderer.php +++ b/src/Renderer/Renderer.php @@ -2,13 +2,8 @@ namespace Engelsystem\Renderer; -use ErrorException; - class Renderer { - /** @var self */ - protected static $instance; - /** @var EngineInterface[] */ protected $renderer = []; @@ -29,7 +24,7 @@ class Renderer return $renderer->get($template, $data); } - engelsystem_error('Unable to find a renderer for template file «' . $template . '».'); + engelsystem_error('Unable to find a renderer for template file "' . $template . '".'); return ''; } @@ -42,21 +37,4 @@ class Renderer { $this->renderer[] = $renderer; } - - /** - * @return self - * @throws ErrorException - */ - public static function getInstance() - { - return self::$instance; - } - - /** - * @param self $instance - */ - public static function setInstance($instance) - { - self::$instance = $instance; - } } diff --git a/src/Routing/UrlGenerator.php b/src/Routing/UrlGenerator.php index 8dc464c6..33eef7b0 100644 --- a/src/Routing/UrlGenerator.php +++ b/src/Routing/UrlGenerator.php @@ -2,8 +2,6 @@ namespace Engelsystem\Routing; -use Engelsystem\Http\Request; - class UrlGenerator { /** @@ -14,7 +12,7 @@ class UrlGenerator public static function to($path, $parameters = []) { $path = '/' . ltrim($path, '/'); - $request = Request::getInstance(); + $request = app('request'); $uri = $request->getUriForPath($path); if (!empty($parameters) && is_array($parameters)) { diff --git a/src/helpers.php b/src/helpers.php index 24f93f2c..733b902d 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -2,12 +2,28 @@ // Some useful functions use Engelsystem\Config\Config; +use Engelsystem\Container\Container; use Engelsystem\Http\Request; use Engelsystem\Renderer\Renderer; use Engelsystem\Routing\UrlGenerator; use Symfony\Component\HttpFoundation\Session\SessionInterface; /** + * Get the global container instance + * + * @param string $id + * @return mixed + */ +function app($id = null) +{ + if (is_null($id)) { + return Container::getInstance(); + } + + return Container::getInstance()->get($id); +} + +/** * Get or set config values * * @param string|array $key @@ -16,15 +32,18 @@ use Symfony\Component\HttpFoundation\Session\SessionInterface; */ function config($key = null, $default = null) { + $config = app('config'); + if (empty($key)) { - return Config::getInstance(); + return $config; } if (is_array($key)) { - Config::getInstance()->set($key); + $config->set($key); + return true; } - return Config::getInstance()->get($key, $default); + return $config->get($key, $default); } /** @@ -34,7 +53,7 @@ function config($key = null, $default = null) */ function request($key = null, $default = null) { - $request = Request::getInstance(); + $request = app('request'); if (is_null($key)) { return $request; @@ -66,7 +85,7 @@ function session($key = null, $default = null) */ function view($template = null, $data = null) { - $renderer = Renderer::getInstance(); + $renderer = app('renderer'); if (is_null($template)) { return $renderer; |