由于添加了一些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>
答案 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