Наипростейший DI-контейнер

1. Возможность добавить зависимости автосборщиком в конструктор. 2. Возможность ручного добавления зависимостей. 3. Автовайринг.

  1. <?php
  2.  
  3. use Closure;
  4. use Exception;
  5. use ReflectionClass;
  6.  
  7. class Container
  8. {
  9. private $dependencies;
  10. private $result = [];
  11.  
  12. public function __construct($dependencies = [])
  13. {
  14. $this->dependencies = $dependencies;
  15. }
  16.  
  17. public function set($key, $value)
  18. {
  19. if (array_key_exists($key, $this->result)) {
  20. unset($this->result[$key]);
  21. }
  22.  
  23. $this->dependencies[$key] = $value;
  24.  
  25. return $this;
  26. }
  27.  
  28. public function has($key)
  29. {
  30. return array_key_exists($key, $this->dependencies) || class_exists($key);
  31. }
  32.  
  33. public function get($key)
  34. {
  35. if (array_key_exists($key, $this->result)) {
  36. return $this->result[$key];
  37. }
  38.  
  39. if (!array_key_exists($key, $this->dependencies)) {
  40.  
  41. if (class_exists($key)) {
  42. $reflectionClass = new ReflectionClass($key);
  43. $args = [];
  44.  
  45. if ($constructor = $reflectionClass->getConstructor()) {
  46.  
  47. foreach ($constructor->getParameters() as $parameter) {
  48.  
  49. if ($parameter->getType()->isBuiltin()) {
  50.  
  51. if (!$parameter->isDefaultValueAvailable()) {
  52. throw new Exception("Не указано значение по умолчанию параметра: $parameter->name");
  53. }
  54.  
  55. $args[] = $parameter->getDefaultValue();
  56. } else {
  57. $args[] = $this->get($parameter->getType()->getName());
  58. }
  59. }
  60. }
  61.  
  62. return $this->result[$key] = $reflectionClass->newInstanceArgs($args);
  63. }
  64.  
  65. throw new Exception("Не найдена зависимость: $key");
  66. }
  67.  
  68. $dependency = $this->dependencies[$key];
  69.  
  70. if ($dependency instanceof Closure) {
  71. $this->result[$key] = $dependency($this);
  72. } else {
  73. $this->result[$key] = $dependency;
  74. }
  75.  
  76. return $this->result[$key];
  77. }
  78. }


  18.01.24 / 06:01 | PHP |   50 | 0   0