Я использую модифицированную копию yadif в качестве моей инфраструктуры инъекций зависимостей.Маркировка классов для инъекций контейнера зависимостей
В настоящее время я создал абстрактный класс AContainerAware, который похож на Symfony2-х ContainerAware:
abstract class AContainerAware{
protected $_container;
public function setContainer(Container $container){
$this->_container = $container;
}
protected function get($component){
//return a component from $this->_container;
}
}
Это хорошо работает в большинстве случаев. У меня просто класс, который требует, чтобы контейнер расширял AContainerAware, и контейнер автоматически вводится каркасом DI во время создания объекта с использованием setContainer()
. Затем я могу легко получить компоненты из контейнера.
Проблема заключается в работе с сторонними пакетами поставщиков. В таких случаях, например, для записи расширения для twig требуется, чтобы я расширил класс Twig_Extension
, что означает, что я не могу расширить AContainerAware
, чтобы получить доступ к контейнеру.
Я рассматриваю, нужно ли поворачивать AContainerAware
в интерфейс IContainerAware
. Поскольку классы могут реализовывать несколько интерфейсов, IContainerAware
должен быть реализован в большинстве случаев. Единственная проблема с этим подходом заключается в том, что в интерфейсе нельзя писать коди get()
, поэтому повторяется необходимость реализации точного кода для этих функций в каждом классе, который требует контейнер. Он также создает проблемы с обслуживанием, если в будущем должны измениться setContainer()
и get()
.
Есть ли лучший способ отметить класс для инъекций контейнера?
Вы можете расширить несколько классов следующим образом: http://stackoverflow.com/questions/356128/can-i-extend-a-class-using-more-than-1-class-in-php – Rijk
Я не знаю, t действительно похоже на подделку множественного наследования с помощью '__call()', хотя для меня это выглядит не очень элегантно. Для этого также требуется копия одного из классов, которые должны быть созданы в классе, какой тип инъекций зависит от зависимости. – F21