如何从我的requestAction
调用view
方法到特定的controller
,根据我提到的条件returns
我的结果?
谢谢!
答案 0 :(得分:5)
一般来说,使用requestAction
并不是非常高效,因为它开始了一个全新的调度过程 - 实质上,您的应用程序正在为用户发出的每个请求处理两个请求。因此,您希望尽可能避免使用它。话虽如此,requestAction
有其用途,您可以使用视图缓存来降低性能损失。
很难准确衡量你想用requestAction
做什么,但基本的概念是你要求CakePHP处理另一个请求,所以你可以简单地传递requestAction
你的应用程序的任何URL处理它是否被输入浏览器的地址栏(不包括协议和主机名)。如果您想要检索由您的应用程序管理的博客集合:
$blogs = $this->requestAction('/blogs/index');
您也可以通过传递路由组件数组来调用requestAction
,方法与将它们传递到HtmlHelper::link
的方式相同。因此,您可以检索博客集合:
$blogs = $this->requestAction('controller'=>'blogs', 'action'=>'index');
只要过滤requestAction
返回的结果集,就可以通过将条件作为URL或路径组件的一部分传递来完成:
$blogs = $this->requestAction('/blogs/index/author_id:1234');
// or
$blogs = $this->requestAction('controller'=>'blogs', 'action'=>'index', 'author_id' => 1234);
请注意,如果您希望所请求的操作返回值,则需要采取与标准操作请求不同的处理请求的操作。对于我上面提到的BlogsController::index
操作,它可能看起来像这样:
class BlogsController extends AppController{
function index(){
$conditions = array();
if ( isset($this->params['author_id'])){
$conditions['Blog.author_id'] = $this->params['author_id'];
}
$blogs = $this->Blog->find('all', array('conditions'=>$conditions);
if ( isset($this->params['requested']) && $this->params['requested'] == 1){
return $blogs;
}
else{
$this->set(compact('blogs'));
}
}
}
检查if
的存在和值的$this->params['requested']
语句是关键部分。它会检查requestAction
是否调用了该操作。如果是,则返回Blog::find
返回的博客集合;否则,它使集合可用于视图,并允许控制器继续渲染视图。
使用requestAction
来获得您需要的具体结果有很多细微差别,但上述内容应该为您提供基础知识。查看 dogmatic69 发布的链接以获取更多文档,当然还有很多关于此主题的stacko问题。
随时随地发表评论!希望这有帮助。
答案 1 :(得分:0)
$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
echo $comment['Comment']['title'];
}
将此代码放入ctp文件