3

我的所有控制器都需要相同的 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”)。

4

5 回答 5

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

你也可以实现同样的编写Controller Plugin。

编辑:

前端控制器插件在每个请求上执行,就像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() ) …
于 2011-02-19T12:51:35.337 回答
1

您可以通过以下方式访问您的闪存消息(您不需要从控制器发送任何内容到您的视图,这都是自动化的)

$fm = new Zend_Controller_Action_Helper_FlashMessenger();
Zend_Debug::dump($fm->getMessages());

在您看来,我还建议您将此代码封装在视图助手中,就像本网站http://grummfy.be/blog/191上显示的那样

于 2011-02-18T20:41:19.007 回答
0

在您的引导程序中:

protected function _initMyActionHelpers() {
    $fm = new My_Controller_Action_Helper_FlashMessenger();
    Zend_Controller_Action_HelperBroker::addHelper($fm);;
}
于 2011-02-18T21:42:05.857 回答
-1

如何避免重复代码?

编写您自己的自定义控制器,在该控制器的init方法中实现该控制器,然后从您的自定义控制器扩展您应用程序中的所有控制器。

但是,@Jeff 提到的使用单独的视图助手的方法(查看链接)通常被视为更好的解决方案。在您的控制器中只做:

$this->_helper->flashMessanger('My message');

查看助手将完成其余的工作。

于 2011-02-18T20:49:09.520 回答
-1

这不是创建新的自定义控制器的原因。只需将此行添加到所有 init() 方法即可。

$this->view->messages = $this->_helper->getHelper('FlashMessenger')->getMessages();
于 2011-02-18T21:02:00.073 回答