2012-01-04 3 views
0

Я использую модифицированную копию 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().

Есть ли лучший способ отметить класс для инъекций контейнера?

+0

Вы можете расширить несколько классов следующим образом: http://stackoverflow.com/questions/356128/can-i-extend-a-class-using-more-than-1-class-in-php – Rijk

+0

Я не знаю, t действительно похоже на подделку множественного наследования с помощью '__call()', хотя для меня это выглядит не очень элегантно. Для этого также требуется копия одного из классов, которые должны быть созданы в классе, какой тип инъекций зависит от зависимости. – F21

ответ

-1

Вы можете использовать PHP traits которые были представлены в PHP 5.4.

Черты позволяют горизонтальное повторное использование кода, тогда как наследование является повторным использованием по вертикали. Класс может использовать несколько признаков, тогда как вы можете наследовать только один родительский класс.

Смежные вопросы