如何扩展Zend_Controller_Action以使所有控制器中的函数通用

时间:2010-09-10 00:36:54

标签: php model-view-controller zend-framework

我想扩展Zend_Controller_Action,这样我就可以使消息传递成为通用的。现在在preDispatch()中,我正在设置所有错误和警告消息。如何使AddMessage(请参阅代码)和preDispatch函数在所有控制器中都是通用的?

<?php

类PlaygroundController扩展了Zend_Controller_Action {

public function init()
{
    /* Initialize action controller here */
}

public function preDispatch()
{
    $flashMessenger = $this->_helper->FlashMessenger;

    $flashMessenger->setNamespace('Errors');
    $this->view->Errors = $flashMessenger->getMessages();

    $flashMessenger->setNamespace('Warnings');
    $this->view->Warnings = $flashMessenger->getMessages();

    $flashMessenger->setNamespace('Messages');
    $this->view->Messages = $flashMessenger->getMessages();

    $flashMessenger->setNamespace('Success');
    $this->view->Success = $flashMessenger->getMessages();

}

protected function AddMessage($message,$type='Errors') {
    $flashMessenger = $this->_helper->FlashMessenger;
    $flashMessenger->setNamespace($type);
    $flashMessenger->addMessage($message);
}

public function flashAction()
{
    $this->AddMessage('This is an error message');
    $this->AddMessage('This is another error message');
    $this->AddMessage('This is a warning message','Warnings');
    $this->AddMessage('This is message','Messages');
    $this->AddMessage('This is another success message','Success');
}

}

4 个答案:

答案 0 :(得分:2)

我没有任何ZF经验,但我无法想象以下为什么不起作用:

abstract class Zend_Controller_MyAction extends Zend_Controller_Action
{
  public function preDispatch()
  {
  ...
  }

  protected function addMessage ($message, $type='Errors')
  {
    ....
  }
  //... other common methods
}

然后,您的PlaygroundController将展开Zend_Controller_MyAction而不是Zend_Controller_Action

答案 1 :(得分:2)

您可以将这两个移动到模型中,并使用Zend_Controller_Front插件注入PreDispatch事件。

答案 2 :(得分:1)

请参阅我的相关问题:Correct Location for Custom Zend_Action_Controller

我刚刚将它放在library/APPNAMESAPCE/Action/Contoller下并将其放入application.ini

autoloadernamespaces.APPNAMESPACE = "APPNAMESPACE_"
appnamespace = "APPNAMESPACE_"

显然,应该将APPNAMESPACE替换为应用程序的命名空间。您应该已经有第二行自动加载模型/表单/等。

我还将library/APPNAMESPACE/用于标准Zend Framework类的任何其他特定于应用程序的子类。

更新:已经建议使用插件,对于这个用例来说肯定是个好主意。猜猜我保留应用程序特定插件的位置?

library/APPNAMESPACE/Action/Contoller/Plugin

当然如果这是一个你将用于多个应用程序的插件,将它放在一个公共库中是有意义的。

答案 3 :(得分:1)

您必须继承Zend_Controller_Action

//library/My/Controller/Action.php
class My_Controller_Action extends Zend_Controller_Action
{
...
}

然后

class IndexController extends My_Controller_Action
{
...
}

或者,你可以将Zend Framework放在项目之外的某个地方,然后重载Zend_Controller_Action类,将它放在/library目录中,这将在Zend库之前读取。

回答了你的问题,我的建议是,你应该避免这样做。

在这种情况下,最佳解决方案似乎是编写自定义flashMessenger。例如。看看这个:

Zend Framework: View Helper Priority Messenger | emanaton