Darano

Untitled

Mar 24th, 2020
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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. }
Advertisement
Add Comment
Please, Sign In to add comment