Darano

Untitled

Mar 24th, 2020
707
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.68 KB | None | 0 0
  1. <?php
  2.  
  3.  
  4. namespace TinyFramework\core;
  5.  
  6.  
  7. use Closure;
  8. use Exception;
  9. use ReflectionClass;
  10.  
  11. class ServiceContainer
  12. {
  13.  
  14.     //singleton
  15.     private static $container_instance = null;
  16.  
  17.     protected $instances = [];
  18.  
  19.     public static function init(){
  20.         if(self::$container_instance === null){
  21.             self::$container_instance = new self();
  22.         }
  23.         return self::$container_instance;
  24.     }
  25.  
  26.     public function set($abstract, $concrete = NULL)
  27.     {
  28.         if ($concrete === NULL) {
  29.             $concrete = $abstract;
  30.         }
  31.         $this->instances[$abstract] = $concrete;
  32.     }
  33.  
  34.     public function get($abstract, $parameters = [])
  35.     {
  36.         // falls nicht vorhanden, registriere
  37.         if (!isset($this->instances[$abstract])) {
  38.             $this->set($abstract);
  39.         }
  40.  
  41.         return $this->resolve($this->instances[$abstract], $parameters);
  42.     }
  43.  
  44.     private function resolve($concrete, $parameters)
  45.     {
  46.         if ($concrete instanceof Closure) {
  47.             return $concrete($this, $parameters);
  48.         }
  49.  
  50.         $reflector = new ReflectionClass($concrete);
  51.  
  52.         // ist klasse instanziierbar?
  53.         if (!$reflector->isInstantiable()) {
  54.             throw new Exception("Klasse {$concrete} kann nicht instanziiert werden!");
  55.         }
  56.  
  57.         // get Konstruktor
  58.         $constructor = $reflector->getConstructor();
  59.         if (is_null($constructor)) {
  60.             // Klasseninstanz holen
  61.             return $reflector->newInstance();
  62.         }
  63.  
  64.         // get Konstruktor params
  65.         $parameters = $constructor->getParameters();
  66.         $dependencies = $this->getDependencies($parameters);
  67.  
  68.         //neue Instanz holen mit allen dependencies resolved
  69.         return $reflector->newInstanceArgs($dependencies);
  70.     }
  71.  
  72.  
  73.     private function getDependencies($parameters)
  74.     {
  75.         $dependencies = [];
  76.         foreach ($parameters as $parameter) {
  77.             // get the type hinted class
  78.             $dependency = $parameter->getClass();
  79.             if ($dependency === NULL) {
  80.                 // default value für Parameter vorhanden?
  81.                 if ($parameter->isDefaultValueAvailable()) {
  82.                     // get default value des Parameters
  83.                     $dependencies[] = $parameter->getDefaultValue();
  84.                 } else {
  85.                     throw new Exception("Parameter {$parameter->name} kann nicht resolved werden. Es wurde kein Standardwert gefunden.");
  86.                 }
  87.             } else {
  88.                 // get dependency resolved
  89.                 $dependencies[] = $this->get($dependency->name);
  90.             }
  91.         }
  92.  
  93.         return $dependencies;
  94.     }
  95. }
Add Comment
Please, Sign In to add comment