Вероломство
Решил попилить DI
PHP:
// config/providers.php return [ coreprovidersrouterProvider::class ]; class Container { private $container = []; public function __construct() { $providers = require_once ‘config/providers.php’; foreach ($providers as $provider) { $service = new $provider($this); $service->init(); } } public function set($service, $object) { $this->container[$service] = $object; } public function get($service) { // return $this->container[$service] ?? null; return $this->container[$service] ? $this->container[$service]() : null; } } class Provider extends ServiceProvider { public function init() { // $this->container->set(‘router’, new Router()); $this->container->set(‘router’, fn() => new Router()); } } class Router { public function __construct() { echo __METHOD__; } } $this->container->get(‘router’); // coreservicesrouterRouter::__constructВ правильном ли направлении двигаюсь?
И не очень понятны некоторые моменты:
Стоит ли через callback делать init()?
Как происходит передача чего-то в конструкторы того, что грузится в контейнер? Вот у меня если есть в контейнере Config, то как мне его в Router прислать? В провайдере сделать параметр и в роутере использовать инъекцию? А как? В fn() или в new Router()? И что тогда будет в инъекции: Config или весь Container и там потом в конструкторе через get() доставать Config — вот такие нюансы интересуют.
Не очень улавливаю в голове только образы в виде карусели что куда летит
Метод контейнера get() вообще смущает полностью.
MouseZver
никогда так не делай в классе. Тебе нужен сборщик конфигов и единый объект от него
Вероломство
я понимаю это черновик, я чтобы заполнить контейнер то в конструктор прикрутил
вот меня и тормозит конфиг как я буду юзать я там расширил вопрос
Вероломство
@MouseZver и вообще не понимаю, как, например, передать в провайдере контейнер в конструктор класса и чтобы в контейнере был сервис, который идёт в массиве ПОСЛЕ, то есть он же ещё не попал в контейнер и его не будет в контейнере отправленном в конструктор сервиса, идущего в массиве ДО, короче не улавливаю пока что
MouseZver
Lazy + запаковка кода в замыканиях
Вероломство
@MouseZver вроде начинаю догонять
ага, покрутил-повертел, прозреваю потиху: на момент же get() они уже все в контейнере по ленивому
— Добавлено —
@MouseZver а правильно, что коллбэком помещаю? Не получается, что при каждом get() новый объект?
MouseZver
На всякий случай
PHP:
<?php class a { public function __invoke() { return 1111; } } $a = new a; $b = fn() => 444; //bool(false) //int(1111) //bool(true)
MouseZver
МногА букв