【问题标题】:cakephp requestAction method View filecakephp requestAction 方法 查看文件
【发布时间】:2011-04-07 09:56:13
【问题描述】:

我如何从我的view 调用requestAction 方法到特定的controllerreturnsme 根据我提到的条件得出结果?

谢谢!

【问题讨论】:

  • 来自 Elijan:您为什么要从视图中这样做? (严肃的问题)

标签: cakephp view model controller


【解决方案1】:

一般来说,使用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 问题。

如有任何后续,请随时发表评论!希望这会有所帮助。

【讨论】:

  • 您添加的大括号完全是多余的,仅供参考。如果ifelse 之后只出现一个语句,则无需将其括在大括号中。
  • 除非您喜欢可读性并遵守严格的编码标准。我的大部分 if 语句都会在以后进行修改。添加新语句意味着我必须添加大括号。忘记这样做会导致更多的调试工作,所以我决定不再将它们排除在外。除非我绝对知道不会将任何代码添加到特定的布尔状态,这是非常罕见的。
【解决方案2】:
$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
    echo $comment['Comment']['title'];
}

将此代码放入您的 ctp 文件中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多