Классы маркировки для внедрения контейнера зависимостей - PullRequest
0 голосов
/ 04 января 2012

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

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

1 Ответ

0 голосов
/ 06 декабря 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...