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文件,是否可以放置此代码,以便执行每个请求而无需调用模块/控制器?
答案 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()
{
// ...
}
}