Zend Framework _forward到同一控制器内的其他动作

时间:2010-06-27 23:47:23

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

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

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

什么是正确的方法?

4 个答案:

答案 0 :(得分:6)

通常,您将安装路由以将用户重定向到正确的(默认)操作,而不是索引操作(读取如何使用Zend_Router从给定路由重定向)。但是你可以直接从控制器那里手动完成所有操作(不过这称为“编写黑客代码来实现某些东西”)。

更改要渲染的“视图脚本”,然后调用您的操作方法....

// 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...)
   }
}

注意:这不是官方的做法,但的解决方案。

答案 1 :(得分:1)

我们也可以使用此助手重定向

  $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

答案 2 :(得分:0)

如果您不想重新发送,则没有理由不能简单地调用该操作 - 它只是一个功能。

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

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

答案 3 :(得分:0)

您还可以创建路线。例如,我在/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

现在你只需要一个动作,那就是索引动作,但请求rss / feed也会去那里。

public function indexAction()
{
    ...
}