Ответ 1
ServiceManager
по умолчанию вводится в любой контроллер ZF2, поскольку он расширяет AbstractController
, реализуя интерфейс ServiceLocatorAwareInterface
.
Второй подход имеет форму " redundancy", потому что, помимо уже имеющего доступ к экземпляру ServiceManager
, всякий раз, когда вам нужно делиться ваш сервис среди ваших контроллеров, вам нужно настроить для каждого из них механизм впрыска. Поскольку у ваших контроллеров уже есть зависимость от ServiceManager, было бы разумнее использовать первый подход и зарегистрировать ваши связанные с доменом службы в ServiceManager
, централизуя таким образом доступ к уровню службы.
Примечание. Следующая часть ответа может выйти за рамки вопроса, но она направлена на предоставление "скрытого" фона исходного.Суб >
Предположим, что мы строим сложную систему, в которой продвигаются низкоуровневые, повторно используемые и тестовые возможности. Наша система многослойна, и мы построили все до уровня обслуживания. Обратите внимание, что до сих пор мы еще не рассматривали веб-уровень "MVC" или даже выбирали определенную инфраструктуру.
В пределах нашего уровня обслуживания (я рассмотрю этот уровень, как он упоминается в вопросе), мы предполагаем, что мы приняли принцип разделения между бизнес-логикой и построением диаграммы объектов (или разрешением зависимостей). Таким образом, у нас есть, вероятно, несколько сложных сервисов, которые создаются на заводе.
Теперь, когда наш сервисный уровень построен, мы решили "подключить" его выше ZF2. Естественно, наши сервисы должны быть доступны из контроллеров, так как ваш вопрос иллюстрирует это, у нас есть больше, чем способ сделать это. Однако мы хотим избежать избыточности и использовать то, что мы уже создали. Предположим, что factory:
//The following class is a part of our Service layer
public class ComplexServiceFactory{
private dependencyA;
private dependencyB;
public function buildComplexService()
{
$service = new ComplexService();
$service->setDependencyA($this->dependecyA);
$service->setDependencyB($this->dependecyB);
return $service;
}
}
Теперь нам нужно только отрегулировать (на самом деле расширить) наш factory, чтобы он мог использоваться логикой ServiceManager
. Этот класс можно рассматривать как часть механизма, используемого для "подключения" нашей системы к ZF2 (это фактически Adapter)
public class SMComplexServiceFactory extends ComplexServiceFactory implements
Zend\ServiceManager\FactoryInterface
{
public function createService(ServiceLocatorInterface $sm)
{
$this->setDependencyA($sm->get('dependecyA'));
$this->setDependencyB($sm->get('dependecyB'));
return parent::buildComplexService;
}
}
Таким образом, мы не создаем конструкцию графа объекта для слоя MVC (иначе это было бы Разделение проблем нарушение и ненужная межслойная связь). Сервис-менеджер + наши классы "Адаптированные" фабрики в некотором смысле являются нашим механизмом разрешения зависимостей. Дело в том, что наша Система по-прежнему переносима, мы могли бы, например, выбрать другую систему (другую структуру) и иметь низкую зависимость от платформы MVC.