将ajax和非ajax操作放在CakePHP中的同一个控制器中

时间:2012-07-13 08:32:09

标签: cakephp

由于添加了一些ajax操作,我在CakePHP应用中遇到了问题。

我的表名为orders,所以显然我的控制器名为OrdersController,模型名为Order

我对CakePHP的最佳实践的理解是,如果我要在Order模型上运行任何逻辑,那么它应该在OrdersController中完成。这对于基本的CRUD来说很好,但是现在我的一些视图需要发送ajax请求来操作Order数据我有问题。

问题是,为了让ajax正常工作,我必须把它放在OrdersController

的开头
var $layout = 'ajax';  // uses an empty layout
var $autoRender=false; // renders nothing by default

然后,为了阻止安全组件干扰我的Ajax表单提交,我还需要这个:

public function beforeFilter() {
    parent::beforeFilter();
    $this->Security->csrfUseOnce = false;
    $this->Security->csrfExpires = '+1 hour';
}

如果控制器仅用于Ajax请求,这一切都不会成为问题,但问题是它也被用于常规的Cake操作。

答案是我应该有两个控制器吗?一个用于常规操作,一个用于ajax操作?这似乎没有在Cake文档中提及,它似乎不是一种非常有效的做事方式。

我知道我可以基于每个操作更改布局和可能的自动渲染设置,但我不知道如何使用csrf设置来执行此操作,这需要在beforeFilter中。< / p>

1 个答案:

答案 0 :(得分:1)

无需单独的控制器。使用cake请求处理程序。在您的控制器方法中,您可以测试它是否是Ajax请求。

if ($this->request->is('ajax')) {
    //set to Ajax layout and security settings, etc

您需要在控制器顶部包含请求处理程序组件:

public $components = array('RequestHandler');

在烹饪书中查看此页面了解更多信息:http://book.cakephp.org/2.0/en/core-libraries/components/request-handling.html