Php Zend Framework _转发到同一控制器内的其他操作

Php Zend Framework _转发到同一控制器内的其他操作,php,model-view-controller,zend-framework,action,Php,Model View Controller,Zend Framework,Action,如何转发到同一控制器内的其他操作,以避免重复所有调度过程 例如: 如果我指向用户控制器,默认操作是这个函数中的indexAction(),我使用_forwad('list')。。。但是所有的调度过程都是重复的。。我不这么认为 什么是正确的方法?通常,您将安装路由以将用户重定向到正确的(默认)操作,而不是索引操作(阅读如何使用Zend_路由器从给定路由重定向)。但是,如果你真的想,你可以直接从控制器手动完成任何事情(不过这被称为“编写黑客代码以达到肮脏的目的”) 更改要呈现的“视图脚本”,然后调用

如何转发到同一控制器内的其他操作,以避免重复所有调度过程

例如: 如果我指向用户控制器,默认操作是这个函数中的indexAction(),我使用_forwad('list')。。。但是所有的调度过程都是重复的。。我不这么认为


什么是正确的方法?

通常,您将安装路由以将用户重定向到正确的(默认)操作,而不是索引操作(阅读如何使用Zend_路由器从给定路由重定向)。但是,如果你真的想,你可以直接从控制器手动完成任何事情(不过这被称为“编写黑客代码以达到肮脏的目的”)

更改要呈现的“视图脚本”,然后调用操作方法

// inside your controller...
public function indexAction() {
  $this->_helper->viewRenderer('foo');  // the name of the action to render instead
  $this->fooAction();  // call foo action now
}
如果您倾向于经常使用此“技巧”,也许您可以编写一个在应用程序中扩展的基本控制器,它可以有如下方法:

abstract class My_Controller_Action extends Zend_Controller_Action {
   protected function _doAction($action) {
      $method = $action . 'Action';
      $this->_helper->viewRenderer($action);
      return $this->$method();   // yes, this is valid PHP
   }
}
然后从您的操作调用该方法

class Default_Controller extends My_Controller_Action
   public function indexAction() {
      if ($someCondition) {
         return $this->_doAction('foo');
      }

      // execute normal code here for index action
   }
   public function fooAction() {
      // foo action goes here (you may even call _doAction() again...)
   }
}

注意:这不是正式的方法,但它是一个解决方案。

如果您不想重新调度,没有理由不能简单地调用操作-它只是一个函数

class Default_Controller extends My_Controller_Action
{
    public function indexAction()
    {
        return $this->realAction();
    }

    public function realAction()
    {
        // ...
    }
}

您还可以创建一条路线。例如,我的/application/config/routes.ini中有一个部分:

; rss
routes.rss.route                = rss
routes.rss.defaults.controller  = rss
routes.rss.defaults.action      = index

routes.rssfeed.route                = rss/feed
routes.rssfeed.defaults.controller  = rss
routes.rssfeed.defaults.action      = index
现在您只需要一个操作,那就是索引操作,但是requess rss/feed也在那里

public function indexAction()
{
    ...
}

我们还可以使用此帮助器重定向

  $this->_helper->redirector->gotoSimple($action, $controller, $module, $params);

  $this->_helper->redirector->gotoSimple('edit'); // Example 1

  $this->_helper->redirector->gotoSimple('edit', null, null, ['id'=>1]); // Example 2 With Params