summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIgor Scheller <igor.scheller@igorshp.de>2017-09-22 14:02:02 +0200
committerIgor Scheller <igor.scheller@igorshp.de>2017-09-22 14:13:19 +0200
commitd49e49c364c1b73e4e4e3b52dc10ee9d0150e447 (patch)
treefd61f2d661638d4fe973b522d0fca8d5d318f7dc /src
parent783c58611ada88460ba670d51ebf4013563e1197 (diff)
Implemented service provider functionality
Diffstat (limited to 'src')
-rw-r--r--src/Application.php80
-rw-r--r--src/Container/ServiceProvider.php31
-rw-r--r--src/helpers.php50
3 files changed, 144 insertions, 17 deletions
diff --git a/src/Application.php b/src/Application.php
index 80538396..b62b28a9 100644
--- a/src/Application.php
+++ b/src/Application.php
@@ -2,7 +2,9 @@
namespace Engelsystem;
+use Engelsystem\Config\Config;
use Engelsystem\Container\Container;
+use Engelsystem\Container\ServiceProvider;
use Psr\Container\ContainerInterface;
class Application extends Container
@@ -10,6 +12,16 @@ class Application extends Container
/** @var string|null */
protected $appPath = null;
+ /** @var bool */
+ protected $isBootstrapped = false;
+
+ /**
+ * Registered service providers
+ *
+ * @var array
+ */
+ protected $serviceProviders = [];
+
/**
* Application constructor.
*
@@ -36,15 +48,73 @@ class Application extends Container
}
/**
+ * @param string|ServiceProvider $provider
+ * @return ServiceProvider
+ */
+ public function register($provider)
+ {
+ if (is_string($provider)) {
+ $provider = $this->get($provider);
+ }
+
+ $this->serviceProviders[] = $provider;
+
+ $provider->register();
+
+ if ($this->isBootstrapped) {
+ $this->call([$provider, 'boot']);
+ }
+
+ return $provider;
+ }
+
+ /**
+ * Boot service providers
+ *
+ * @param Config|null $config
+ */
+ public function bootstrap(Config $config = null)
+ {
+ if ($this->isBootstrapped) {
+ return;
+ }
+
+ if ($config instanceof Config) {
+ foreach ($config->get('providers', []) as $provider) {
+ $this->register($provider);
+ }
+ }
+
+ foreach ($this->serviceProviders as $provider) {
+ $this->call([$provider, 'boot']);
+ }
+
+ $this->isBootstrapped = true;
+ }
+
+ protected function registerPaths()
+ {
+ $appPath = $this->appPath;
+
+ $this->instance('path', $appPath);
+ $this->instance('path.config', $appPath . DIRECTORY_SEPARATOR . 'config');
+ $this->instance('path.lang', $appPath . DIRECTORY_SEPARATOR . 'locale');
+ }
+
+ /**
+ * Set app base path
+ *
* @param string $appPath
* @return static
*/
public function setAppPath($appPath)
{
+ $appPath = realpath($appPath);
$appPath = rtrim($appPath, DIRECTORY_SEPARATOR);
$this->appPath = $appPath;
- $this->instance('path', $appPath);
+
+ $this->registerPaths();
return $this;
}
@@ -56,4 +126,12 @@ class Application extends Container
{
return $this->appPath;
}
+
+ /**
+ * @return bool
+ */
+ public function isBooted()
+ {
+ return $this->isBootstrapped;
+ }
}
diff --git a/src/Container/ServiceProvider.php b/src/Container/ServiceProvider.php
new file mode 100644
index 00000000..2a1bbebf
--- /dev/null
+++ b/src/Container/ServiceProvider.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Engelsystem\Container;
+
+use Engelsystem\Application;
+
+abstract class ServiceProvider
+{
+ /** @var Application */
+ protected $app;
+
+ /**
+ * ServiceProvider constructor.
+ *
+ * @param Application $app
+ */
+ public function __construct(Application $app)
+ {
+ $this->app = $app;
+ }
+
+ /**
+ * Register container bindings
+ */
+ public function register() { }
+
+ /**
+ * Called after other services had been registered
+ */
+ public function boot() { }
+}
diff --git a/src/helpers.php b/src/helpers.php
index de303963..c3c727ec 100644
--- a/src/helpers.php
+++ b/src/helpers.php
@@ -24,6 +24,15 @@ function app($id = null)
}
/**
+ * @param string $path
+ * @return string
+ */
+function base_path($path = '')
+{
+ return app('path') . (empty($path) ? '' : DIRECTORY_SEPARATOR . $path);
+}
+
+/**
* Get or set config values
*
* @param string|array $key
@@ -47,6 +56,15 @@ function config($key = null, $default = null)
}
/**
+ * @param string $path
+ * @return string
+ */
+function config_path($path = '')
+{
+ return app('path.config') . (empty($path) ? '' : DIRECTORY_SEPARATOR . $path);
+}
+
+/**
* @param string $key
* @param mixed $default
* @return Request|mixed
@@ -79,22 +97,6 @@ function session($key = null, $default = null)
}
/**
- * @param string $template
- * @param mixed[] $data
- * @return Renderer|string
- */
-function view($template = null, $data = null)
-{
- $renderer = app('renderer');
-
- if (is_null($template)) {
- return $renderer;
- }
-
- return $renderer->render($template, $data);
-}
-
-/**
* @param string $path
* @param array $parameters
* @return UrlGenerator|string
@@ -109,3 +111,19 @@ function url($path = null, $parameters = [])
return $urlGenerator->to($path, $parameters);
}
+
+/**
+ * @param string $template
+ * @param mixed[] $data
+ * @return Renderer|string
+ */
+function view($template = null, $data = null)
+{
+ $renderer = app('renderer');
+
+ if (is_null($template)) {
+ return $renderer;
+ }
+
+ return $renderer->render($template, $data);
+}