Ответ, на который вы сослались, принадлежит Робу Аллену, одному из основных разработчиков Zend Framework, так что в какой-то степени он прав. Вы можете без проблем работать с помощниками действий на контроллерах.
Но снаружи это совершенно неправильно. Сервис не имеет ничего общего с помощниками действий и фронт-контроллером. Вы не можете установить зависимость от него (сервисы для помощников действий).
Таким образом, поскольку загрузчик приложения работает как контейнер для инициализации приложения, разумно получить от него необходимые значения. Первое, что я бы посоветовал вам использовать Zend_Registry
. Но, насколько я могу судить, инициализация сеансового объекта будет такой же, поскольку он не будет удален, это просто объект, ссылающийся на собственные суперглобальные $_SESSION
. Итак, просто позвоните
new Zend_Session_Namespace($nameSpace)
.
Но опять же, это неправильно. Вы не должны сообщать своим службам, как обрабатываются сеансы (таким образом создавая объекты внутри него):
$session = Zend_Controller_Action_HelperBroker::getStaticHelper('session')->direct()
или даже
$session = Zend_Registry('userSession')
или
$session = new Zend_Session_Namespace('userSession')
При этом вы также не используете контейнер начальной загрузки вообще. Вместо этого вы должны предоставить общий интерфейс для работы с сеансами (это может быть $ _SESSION или даже база данных) и добавить его в службу в качестве параметра (например, __construct($session)
). Но это совершенно новый предмет (инъекция зависимости).
Итак, у вас есть два варианта, учитывая текущее состояние ZendFramework 1.11 (оно уже старое и полно плохих практик):
1) Вы будете пользоваться услугами через контроллеры:
Таким образом, вы получите сеанс через помощника действий, а затем передадите его в качестве параметра в службу.
new Vovkin_Model_Service_UserLoginService($session)
2) Вы будете использовать службы независимо от контроллеров и получите зависимости через контейнер начальной загрузки:
Что ж, хуже всего то, что для получения начальной загрузки вам нужна зависимость от frontController.
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
Итак, избегайте этого и перейдите к первому варианту, добавив вместо этого зависимость. Хотя, если вы действительно хотите таким образом, обращайтесь к нему напрямую:
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$bootstrap->get('userSession')
К сожалению, в конце концов, все не так. Но это лучшее, что вы можете сделать с ZF 1. Вы должны рассчитывать на ZF 2 и Symfony 2, чтобы лучше понять эти концепции.
Вот хорошее объяснение: http://symfony.com/doc/current/book/service_container.html
(Я знаю, что вы используете ZF, но это не имеет значения, концепция - это ключ)