Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace TinyFramework\core;
- use Closure;
- use Exception;
- use ReflectionClass;
- class ServiceContainer
- {
- //singleton
- private static $container_instance = null;
- protected $instances = [];
- public static function init(){
- if(self::$container_instance === null){
- self::$container_instance = new self();
- }
- return self::$container_instance;
- }
- public function set($abstract, $concrete = NULL)
- {
- if ($concrete === NULL) {
- $concrete = $abstract;
- }
- $this->instances[$abstract] = $concrete;
- }
- public function get($abstract, $parameters = [])
- {
- // falls nicht vorhanden, registriere
- if (!isset($this->instances[$abstract])) {
- $this->set($abstract);
- }
- return $this->resolve($this->instances[$abstract], $parameters);
- }
- private function resolve($concrete, $parameters)
- {
- if ($concrete instanceof Closure) {
- return $concrete($this, $parameters);
- }
- $reflector = new ReflectionClass($concrete);
- // ist klasse instanziierbar?
- if (!$reflector->isInstantiable()) {
- throw new Exception("Klasse {$concrete} kann nicht instanziiert werden!");
- }
- // get Konstruktor
- $constructor = $reflector->getConstructor();
- if (is_null($constructor)) {
- // Klasseninstanz holen
- return $reflector->newInstance();
- }
- // get Konstruktor params
- $parameters = $constructor->getParameters();
- $dependencies = $this->getDependencies($parameters);
- //neue Instanz holen mit allen dependencies resolved
- return $reflector->newInstanceArgs($dependencies);
- }
- private function getDependencies($parameters)
- {
- $dependencies = [];
- foreach ($parameters as $parameter) {
- // get the type hinted class
- $dependency = $parameter->getClass();
- if ($dependency === NULL) {
- // default value für Parameter vorhanden?
- if ($parameter->isDefaultValueAvailable()) {
- // get default value des Parameters
- $dependencies[] = $parameter->getDefaultValue();
- } else {
- throw new Exception("Parameter {$parameter->name} kann nicht resolved werden. Es wurde kein Standardwert gefunden.");
- }
- } else {
- // get dependency resolved
- $dependencies[] = $this->get($dependency->name);
- }
- }
- return $dependencies;
- }
- }
Add Comment
Please, Sign In to add comment