public function init(){ $this->view->user = Zend_Auth::getInstance()->getIdentity(); $this->view->siteName = Zend_Registry::get('config')->site->name; $this->view->menu = $this->_helper->generateMenu(Zend_Auth::getInstance()->getIdentity()); $this->view->slogan = Zend_Registry::get('config')->site->slogan; }
Это файл инициализации во всех моих контроллерах во всех модулях, есть ли место, где я могу поместить этот код, чтобы он выполнял каждый запрос независимо от вызываемого модуля / контроллера?
Вы можете расширить Zend_Controller_Action:
public class My_Controller_Action extends Zend_Controller_Action { public function init() { $this->view->user = Zend_Auth::getInstance()->getIdentity(); $this->view->siteName = Zend_Registry::get('config')->site->name; $this->view->menu = $this->_helper->generateMenu(Zend_Auth::getInstance()->getIdentity()); $this->view->slogan = Zend_Registry::get('config')->site->slogan; } }
Затем вы просто меняете свои контроллеры для расширения My_Controller_Action, а не Zend_Controller_Action. Просто имейте в виду, что если вам нужно добавить дополнительный код к методу init контроллера, вам также придется вызвать parent :: init ():
public class FooController extends My_Controller_Action { public function init() { parent::init(); // Do something. } public function IndexAction() { // ... } }
Я бы посоветовал вам написать плагин, расширив Zend_Controller_Plugin_Abstract, это его цель.
Таким образом, вам не нужно ничего делать в вашем контроллере. Затем вы можете использовать реестр для доступа к своим данным …
class My_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract { protected $_auth = null; protected $_acl = null; public function __construct (Zend_Auth $auth, Zend_Acl $acl) { $this->_auth = $auth; $this->_acl = $acl; } public function preDispatch(Zend_Controller_Request_Abstract $request) { //some code } }
И затем в вашем bootstrap.php
$this->_front->registerPlugin(new My_Controller_Plugin_Layout());
http://framework.zend.com/manual/en/zend.controller.plugins.html
Чтобы совместно использовать код между контроллерами, создайте помощник действий, который был разработан в первую очередь для решения проблемы, которую вы имеете.
Их можно запустить «по требованию»:
$myHelper = $this->_helper->MyHelper; $myHelper->someFunction();
а также набор крючков, которые процесс отправки вызовет автоматически. Чтобы использовать крючки, вам необходимо зарегистрировать помощника действий с брокером:
$helper = new App_Controller_Action_Helper(); Zend_Controller_Action_HelperBroker::addHelper($helper);
Доступные крючки:
init()
preDispatch()
postDispatch()
Для получения дополнительной информации страницу руководства можно найти по адресу http://framework.zend.com/manual/en/zend.controller.actionhelpers.html, и я написал несколько статей о них: http://akrabat.com / 2008/10/31 / с использованием-action-help-in-zend-framework / и http://akrabat.com/2008/11/05/hooks-in-action-helpers/