如何在所有控制器中集中我的init函数的代码?

时间:2009-05-14 23:25:00

标签: php zend-framework

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;
    }

这是所有模块中所有控制器中的init文件,是否可以放置此代码,以便执行每个请求而无需调用模块/控制器?

3 个答案:

答案 0 :(得分:7)

我宁愿建议您通过扩展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

答案 1 :(得分:4)

要跨控制器共享代码,请创建一个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/

答案 2 :(得分:3)

您可以扩展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()
    {
        // ...
    }
}