【发布时间】:2011-04-07 09:56:13
【问题描述】:
我如何从我的view 调用requestAction 方法到特定的controller,returnsme 根据我提到的条件得出结果?
谢谢!
【问题讨论】:
-
来自 Elijan:您为什么要从视图中这样做? (严肃的问题)
标签: cakephp view model controller
我如何从我的view 调用requestAction 方法到特定的controller,returnsme 根据我提到的条件得出结果?
谢谢!
【问题讨论】:
标签: cakephp view model controller
一般来说,使用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'));
}
}
}
检查$this->params['requested'] 的存在和值的if 语句是关键部分。它检查操作是否由requestAction 调用。如果是,则返回Blog::find返回的博客集合;否则,它将使集合对视图可用,并允许控制器继续渲染视图。
使用requestAction 来获得您需要的特定结果有很多细微差别,但以上内容应该为您提供了基础知识。查看 dogmatic69 发布的链接以获取更多文档,当然还有很多关于该主题的 stacko 问题。
如有任何后续,请随时发表评论!希望这会有所帮助。
【讨论】:
if 或else 之后只出现一个语句,则无需将其括在大括号中。
$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
echo $comment['Comment']['title'];
}
将此代码放入您的 ctp 文件中
【讨论】: