Я использую модифицированную копию yadif в качестве моей структуры внедрения зависимостей.
В настоящее время я создал абстрактный класс AContainerAware, который похож на ContainerAware * 1006 Symfony2*:
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
должно быть реализовано в большинстве случаев.Единственная проблема с этим подходом состоит в том, что нельзя написать какой-либо код для setContainer()
и get()
в интерфейсе, поэтому повторять необходимость реализации точного кода для этих функций в каждом классе, для которого требуется контейнер, повторяется.Кроме того, возникают проблемы с поддержкой, если setContainer()
и get()
будут изменены в будущем.
Есть ли лучший способ пометить класс для инъекции контейнера?