summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Scheller <igor.scheller@igorshp.de>2017-08-31 17:30:54 +0200
committerIgor Scheller <igor.scheller@igorshp.de>2017-08-31 17:30:54 +0200
commit8c81adc8e83969e90b4c54daf4a396b1094134ff (patch)
treeae5b7e5bd826a9287d8fa34627d5b67c58e6fb22
parent0a20883aa862779b48fd2a297456c2db04cffb95 (diff)
Implemented container
-rw-r--r--.gitignore3
-rw-r--r--composer.json3
-rw-r--r--includes/engelsystem_provider.php20
-rw-r--r--includes/helper/internationalization_helper.php4
-rw-r--r--includes/pages/user_atom.php3
-rw-r--r--public/index.php3
-rw-r--r--src/Config/Config.php28
-rw-r--r--src/Container/Container.php105
-rw-r--r--src/Container/ContainerException.php11
-rw-r--r--src/Container/NotFoundException.php10
-rw-r--r--src/Http/Request.php25
-rw-r--r--src/Renderer/Renderer.php24
-rw-r--r--src/Routing/UrlGenerator.php4
-rw-r--r--src/helpers.php29
14 files changed, 175 insertions, 97 deletions
diff --git a/.gitignore b/.gitignore
index d712148b..eb3f8939 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,8 +14,9 @@ Thumbs.db
_vimrc_local.vim
.sass-cache
-# PHPstorm config
+# PHPstorm files
/.idea/
+/.phpstorm.meta.php
# Project files
/config/config.php
diff --git a/composer.json b/composer.json
index 45dce626..0769a6b6 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,8 @@
"php": ">=7.0.0",
"erusev/parsedown": "1.6.*",
"twbs/bootstrap": "^3.3",
- "symfony/http-foundation": "^3.3"
+ "symfony/http-foundation": "^3.3",
+ "psr/container": "^1.0"
},
"require-dev": {
"phpunit/phpunit": "^6.3"
diff --git a/includes/engelsystem_provider.php b/includes/engelsystem_provider.php
index aed331d4..f3c161a6 100644
--- a/includes/engelsystem_provider.php
+++ b/includes/engelsystem_provider.php
@@ -1,11 +1,13 @@
<?php
use Engelsystem\Config\Config;
+use Engelsystem\Container\Container;
use Engelsystem\Database\Db;
use Engelsystem\Exceptions\Handler as ExceptionHandler;
use Engelsystem\Http\Request;
use Engelsystem\Renderer\HtmlEngine;
use Engelsystem\Renderer\Renderer;
+use Psr\Container\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
/**
@@ -14,11 +16,20 @@ use Symfony\Component\HttpFoundation\Session\Session;
require_once __DIR__ . '/autoload.php';
+
+/**
+ * Initialize the container
+ */
+$container = Container::getInstance();
+$container->instance('container', $container);
+$container->instance(ContainerInterface::class, $container);
+
+
/**
* Load configuration
*/
$config = new Config();
-Config::setInstance($config);
+$container->instance('config', $config);
$config->set(require __DIR__ . '/../config/config.default.php');
if (file_exists(__DIR__ . '/../config/config.php')) {
@@ -37,7 +48,8 @@ date_default_timezone_set($config->get('timezone'));
* @var Request $request
*/
$request = Request::createFromGlobals();
-$request::setInstance($request);
+$container->instance('request', $request);
+
/**
* Check for maintenance
@@ -52,14 +64,15 @@ if ($config->get('maintenance')) {
* Initialize renderer
*/
$renderer = new Renderer();
+$container->instance('renderer', $renderer);
$renderer->addRenderer(new HtmlEngine());
-Renderer::setInstance($renderer);
/**
* Register error handler
*/
$errorHandler = new ExceptionHandler();
+$container->instance('error.handler', $errorHandler);
if (config('environment') == 'development') {
$errorHandler->setEnvironment(ExceptionHandler::ENV_DEVELOPMENT);
ini_set('display_errors', true);
@@ -171,6 +184,7 @@ foreach ($includeFiles as $file) {
* Init application
*/
$session = new Session();
+$container->instance('session', $session);
$session->start();
$request->setSession($session);
diff --git a/includes/helper/internationalization_helper.php b/includes/helper/internationalization_helper.php
index 131941e9..efbe5db5 100644
--- a/includes/helper/internationalization_helper.php
+++ b/includes/helper/internationalization_helper.php
@@ -1,7 +1,5 @@
<?php
-use Engelsystem\Http\Request;
-
/**
* Return currently active locale
*
@@ -65,7 +63,7 @@ function gettext_locale($locale = null)
*/
function make_langselect()
{
- $request = Request::getInstance();
+ $request = app('request');
$items = [];
foreach (config('locales') as $locale => $name) {
diff --git a/includes/pages/user_atom.php b/includes/pages/user_atom.php
index 2991bdbf..c9d9398e 100644
--- a/includes/pages/user_atom.php
+++ b/includes/pages/user_atom.php
@@ -1,7 +1,6 @@
<?php
use Engelsystem\Database\DB;
-use Engelsystem\Http\Request;
/**
* Publically available page to feed the news to feed readers
@@ -45,7 +44,7 @@ function user_atom()
*/
function make_atom_entries_from_news($news_entries)
{
- $request = Request::getInstance();
+ $request = app('request');
$html = '<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Engelsystem</title>
diff --git a/public/index.php b/public/index.php
index b44e1491..c65dbdf8 100644
--- a/public/index.php
+++ b/public/index.php
@@ -1,7 +1,5 @@
<?php
-use Engelsystem\Http\Request;
-
require_once realpath(__DIR__ . '/../includes/engelsystem_provider.php');
$free_pages = [
@@ -27,7 +25,6 @@ $page = '';
$title = '';
$content = '';
-/** @var Request $request */
$page = $request->query->get('p');
if (empty($page)) {
$page = $request->path();
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 &laquo;' . $template . '&raquo;.');
+ 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;