tex*_*xai 3 zend-framework controller init zend-framework-mvc
我在所有控制器中都需要相同的2行,每个控制器都有自己的初始化逻辑,但这两行对所有控制器都是通用的.
public function init()
{
$fm =$this->_helper->getHelper('FlashMessenger');
$this->view->messages = $fm->getMessages();
}
Run Code Online (Sandbox Code Playgroud)
如何避免重复代码?
更新:
好吧,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);
Run Code Online (Sandbox Code Playgroud)
问题是,我应该在哪里放置这些行,以避免在每个控制器的所有init()中重复它们.这些行应该放在bootstrap?如果是这样:如何跳过'someAction'的日志行.或者我应该实现'BaseController'并使我的所有控制器从它扩展.如果是这样:我如何自动加载它?(致命错误:未找到类'BaseController').
只是控制器的子类:
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 {
}
Run Code Online (Sandbox Code Playgroud)
您也可以实现相同的写入Controller插件.
前控制器插件在每个请求上执行,就像它们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
Run Code Online (Sandbox Code Playgroud)
此外,您可以检查控制器参数以仅在选定的请求上执行代码:
if ('admin' == $this->getRequest()->getModuleName()
&& 'update' == $this->getRequest()->getActionName() ) …
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2977 次 |
最近记录: |