summaryrefslogtreecommitdiff
path: root/src/Application.php
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/Application.php
parent783c58611ada88460ba670d51ebf4013563e1197 (diff)
Implemented service provider functionality
Diffstat (limited to 'src/Application.php')
-rw-r--r--src/Application.php80
1 files changed, 79 insertions, 1 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;
+ }
}