Как централизовать код из моих функций инициализации во всех контроллерах? - PullRequest
2 голосов
/ 15 мая 2009
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;
    }

Это файл инициализации во всех моих контроллерах во всех модулях. Есть ли место, где я могу поместить этот код, чтобы он выполнял каждый запрос независимо от того, вызывается ли модуль / контроллер?

Ответы [ 3 ]

7 голосов
/ 15 мая 2009

Я бы посоветовал вам написать плагин, расширив 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

4 голосов
/ 15 мая 2009

Для совместного использования кода между контроллерами создайте Action Helper, который был разработан в первую очередь для решения вашей проблемы.

Они могут быть запущены «по требованию»:

$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/using-action-helpers-in-zend-framework/ и http://akrabat.com/2008/11/05/hooks-in-action-helpers/

3 голосов
/ 15 мая 2009

Вы можете расширить 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()
    {
        // ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...