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