Навеяло обсуждением в другой теме.
Сразу хочу сказать что все описанное ниже из разряда извращений и только для коробочных продуктов где важно расширение любого функционала сторонними модулями и в данный момент самое жизнеспособное решение это через цепочку наследования (пример xenforo/magento).
но с таким подходом нормальное явное DI в конструкторе не сделать:
Setter/Property injection - фигово тем что или описание зависимостей находится полностью отдельно от класса, в конфиге контейнера и к тому же есть возможность инстанцировать полностью невалидный класс.
Ну и любимый мной SL - одна супер зависимость - контейнер, которая рулит всем (как раз так и делают везде)
Как еще можно сделать инъекцию зависимостей чтобы было более менее явно, описано не в контейнере, а в самом классе и чтобы можно было так наследовать? Ну или как еще расширять коробочный продукт, независимыми модулями (вариант событий/хуков в определенных точках не позволяет сделать что угодно)?
P.S. Понимаю что задача изначально - извращение, но коробочные продукты они такие
Сразу хочу сказать что все описанное ниже из разряда извращений и только для коробочных продуктов где важно расширение любого функционала сторонними модулями и в данный момент самое жизнеспособное решение это через цепочку наследования (пример xenforo/magento).
но с таким подходом нормальное явное DI в конструкторе не сделать:
PHP:
//базовый
class Main {
public $dep1;
__construct(Dep1 $dep1) {
$this->dep1 = $dep1;
}
}
//пример цепочки наследования для первого модуля
//здесь проблем нет, т.к. 100% известен родитель
class AddonMain extends Proxy_AddonMain {
public $dep2;
__construct(Dep1 $dep1, Dep2 $dep2) {
parent::__construct($dep1);
$this->dep2 = $dep2;
}
}
// класс Proxy_AddonMain вычисляется динамически через class_alias или через генерацию прокси прокладки:
class Proxy_AddonMain extends Main {}
//вот когда модулей больше 2-х и их порядок при написании кода не может быть известен то нормальный явный конструктор уже не сделать:
class Addon2Main extends Proxy_Addon2Main {
public $dep3;
//заранее не известны зависимости родителя потому правильную сигнатуру не сделать
// splat оператор и магия через рефлексию - все очень не явно
__construct(Dep1 $dep1, Dep2 $dep3) { // это ломает все
parent::__construct($dep1);
$this->dep3 = $dep3;
}
}
Ну и любимый мной SL - одна супер зависимость - контейнер, которая рулит всем (как раз так и делают везде)
Как еще можно сделать инъекцию зависимостей чтобы было более менее явно, описано не в контейнере, а в самом классе и чтобы можно было так наследовать? Ну или как еще расширять коробочный продукт, независимыми модулями (вариант событий/хуков в определенных точках не позволяет сделать что угодно)?
P.S. Понимаю что задача изначально - извращение, но коробочные продукты они такие
