我的所有控制器都需要相同的2行,每个控制器都有自己的初始化逻辑,但这两行对所有控制器都是通用的。
public function init()
{
$fm =$this->_helper->getHelper('FlashMessenger');
$this->view->messages = $fm->getMessages();
}
如何避免重复代码?
更新
好吧,FlashMessenger只是一个例子,假设我需要在每个动作中写一个日志行,除了'someAction'@'someController'。所以新的共同线应该是。
$this->logger = new Zend_Log();
$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH.'/../logs/log.txt');
$this->logger->addWriter($writer);
$this->logger->log('Some Message',Zend_Log::DEBUG);
问题是,我应该在哪里放置这些行,以避免在每个控制器的所有init()中重复这些行。 这些行应该放在bootstrap?如果是这样:如何跳过'someAction'的日志行。 或者我应该实现'BaseController'并使我的所有控制器从它扩展。如果是这样:我如何自动加载它? (致命错误:未找到类'BaseController'。
答案 0 :(得分:6)
只是控制器的子类:
class Application_ControllerAction extends Zend_Controller_Action {
public function init()
{
$fm =$this->_helper->getHelper('FlashMessenger');
$this->view->messages = $fm->getMessages();
}
}
class IndexController extends Application_ControllerAction {
}
你也可以实现相同的写作控制器插件。
Front controller plugins在每个请求上执行,就像Controllers
一样,并且具有相同的钩子方法:
routeStartup(): prior to routing the request
routeShutdown(): after routing the request
dispatchLoopStartup(): prior to entering the dispatch loop
preDispatch(): prior to dispatching an individual action
postDispatch(): after dispatching an individual action
dispatchLoopShutdown(): after completing the dispatch loop
此外,您可以检查控制器参数以仅在选定的请求上执行代码:
if ('admin' == $this->getRequest()->getModuleName()
&& 'update' == $this->getRequest()->getActionName() ) …
答案 1 :(得分:1)
您可以通过以下方式访问您的Flash消息(您无需从控制器向视图发送任何内容,这些都是自动化的)
$fm = new Zend_Controller_Action_Helper_FlashMessenger();
Zend_Debug::dump($fm->getMessages());
在您看来,我还建议您将此代码封装在视图助手中,就像在此网站上显示的那样http://grummfy.be/blog/191
答案 2 :(得分:0)
在你的引导程序中:
protected function _initMyActionHelpers() {
$fm = new My_Controller_Action_Helper_FlashMessenger();
Zend_Controller_Action_HelperBroker::addHelper($fm);;
}
答案 3 :(得分:-1)
如何避免重复代码?
编写自己的自定义控制器,在该控制器的init
方法中实现,然后从自定义控制器扩展应用程序中的所有控制器。
但是@Jeff提到的单独视图助手的方法(查看链接)通常被视为更好的解决方案。 在你的控制器中只做:
$this->_helper->flashMessanger('My message');
并且查看助手将完成剩下的工作。
答案 4 :(得分:-1)
这不是创建新自定义控制器的原因。只需将此行添加到所有init()方法中即可。
$this->view->messages = $this->_helper->getHelper('FlashMessenger')->getMessages();