В правильном ли направлении двигаемся?

Вероломство

Решил попилить DI

PHP:
  1. // config/providers.php
  2. return [
  3.     coreprovidersrouterProvider::class
  4. ];
  5.  
  6. class Container
  7. {
  8.     private $container = [];
  9.  
  10.     public function __construct()
  11.     {
  12.         $providers = require_once ‘config/providers.php’;
  13.  
  14.         foreach ($providers as $provider) {
  15.             $service = new $provider($this);
  16.             $service->init();
  17.         }
  18.     }
  19.  
  20.     public function set($service, $object)
  21.     {
  22.         $this->container[$service] = $object;
  23.     }
  24.  
  25.     public function get($service)
  26.     {
  27.         // return $this->container[$service] ?? null;
  28.         return $this->container[$service] ? $this->container[$service]() : null;
  29.     }
  30. }
  31.  
  32.  
  33. class Provider extends ServiceProvider
  34. {
  35.     public function init()
  36.     {
  37.         // $this->container->set(‘router’, new Router());
  38.         $this->container->set(‘router’, fn() => new Router());
  39.     }
  40. }
  41.  
  42. class Router
  43. {
  44.     public function __construct()
  45.     {
  46.         echo __METHOD__;
  47.     }
  48. }
  49.  
  50. $this->container->get(‘router’); // coreservicesrouterRouter::__construct

В правильном ли направлении двигаюсь?

И не очень понятны некоторые моменты:

Стоит ли через callback делать init()?

Как происходит передача чего-то в конструкторы того, что грузится в контейнер? Вот у меня если есть в контейнере Config, то как мне его в Router прислать? :) В провайдере сделать параметр и в роутере использовать инъекцию? А как? В fn() или в new Router()? И что тогда будет в инъекции: Config или весь Container и там потом в конструкторе через get() доставать Config — вот такие нюансы интересуют.

Не очень улавливаю в голове только образы в виде карусели что куда летит :rolleyes:

Метод контейнера get() вообще смущает полностью.

 

MouseZver

никогда так не делай в классе. Тебе нужен сборщик конфигов и единый объект от него

 

Вероломство

я понимаю :) это черновик, я чтобы заполнить контейнер то в конструктор прикрутил

вот меня и тормозит конфиг как я буду юзать я там расширил вопрос

 

Вероломство

@MouseZver и вообще не понимаю, как, например, передать в провайдере контейнер в конструктор класса и чтобы в контейнере был сервис, который идёт в массиве ПОСЛЕ, то есть он же ещё не попал в контейнер и его не будет в контейнере отправленном в конструктор сервиса, идущего в массиве ДО, короче не улавливаю пока что

 

MouseZver

Lazy + запаковка кода в замыканиях :)

 

Вероломство

@MouseZver вроде начинаю догонять

ага, покрутил-повертел, прозреваю потиху: на момент же get() они уже все в контейнере по ленивому :)
— Добавлено —
@MouseZver а правильно, что коллбэком помещаю? Не получается, что при каждом get() новый объект?

 

MouseZver

На всякий случай

PHP:
  1. <?php
  2.  
  3. class a
  4. {
  5.     public function __invoke()
  6.     {
  7.         return 1111;
  8.     }
  9. }
  10.  
  11. $a = new a;
  12.  
  13. $b = fn() => 444;
  14.  
  15. var_dump ( $a instanceof Closure, $a(), $b instanceof Closure );
  16. //bool(false)
  17. //int(1111)
  18. //bool(true)
 

MouseZver

МногА букв

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *