cakephp requestAction方法查看文件

时间:2011-04-07 09:56:14

标签: cakephp view model controller

如何从我的requestAction调用view方法到特定的controller,根据我提到的条件returns我的结果?

谢谢!

2 个答案:

答案 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文件