我有一个 AJAX 后调用到一个cakePhp控制器:
$.ajax({
type: "POST",
url: 'locations/add',
data: {
abbreviation: $(jqInputs[0]).val(),
description: $(jqInputs[1]).val()
},
success: function (response) {
if(response.status === "success") {
// do something with response.message or whatever other data on success
console.log('success');
} else if(response.status === "error") {
// do something with response.message or whatever other data on error
console.log('error');
}
}
});
当我尝试这样做时,我得到以下错误消息:
控制器操作只能返回Cake\Network\Response或空值。
在AppController中,我有以下内容
$this->loadComponent('RequestHandler');
已启用。
控制器函数如下所示:
public function add()
{
$this->autoRender = false; // avoid to render view
$location = $this->Locations->newEntity();
if ($this->request->is('post')) {
$location = $this->Locations->patchEntity($location, $this->request->data);
if ($this->Locations->save($location)) {
//$this->Flash->success(__('The location has been saved.'));
//return $this->redirect(['action' => 'index']);
return json_encode(array('result' => 'success'));
} else {
//$this->Flash->error(__('The location could not be saved. Please, try again.'));
return json_encode(array('result' => 'error'));
}
}
$this->set(compact('location'));
$this->set('_serialize', ['location']);
}
我错过了什么?是否需要任何额外的设置?
8条答案
按热度按时间t98cgbkg1#
不要返回json_encode结果,而是使用该结果设置响应主体并将其返回。
编辑(署名:@沃伦·塞金特)
从CakePHP 3.4开始,我们应该使用
而不是:
CakePHP文档
az31mfrm2#
我在这里看到的大多数答案要么是过时的,要么是不必要的信息过多,要么是依赖于
withBody()
,这让人感觉像是在变通,而不是CakePHP的方式。以下是对我有效的方法:
更多关于
RequestHandler
的信息。看起来它不会很快被弃用。更新:蛋糕PHP 4
More info
9wbgstp73#
返回
JSON
响应的内容很少:1.加载
RequestHandler
组件1.将渲染模式设置为
json
1.设置内容类型
1.设置所需数据
1.定义
_serialize
值例如,您可以将前3个步骤移至父控制器类中的某个方法:
稍后在你的控制器中你应该调用这个方法,并设置所需的数据;
而且,看起来您还应该检查
request->is('ajax)
;我不确定在GET
请求的情况下是否返回json
,因此在if-post
块内调用setJsonResponse
方法;在ajax-call成功处理程序中,您应该检查
result
字段值:2ekbmq324#
在最新版本的CakePHP中,不赞成使用
$this->response->type()
和$this->response->body()
。而应使用
$this->response->withType()
和$this->response->withStringBody()
例如:
(* 这是从已接受的答案中截取的 *)
相关文件
3phpmpom5#
返回JSON数据时,需要定义数据类型和响应主体信息,如下所示:
在您的情况下,只需使用以下代码更改
return json_encode(array('result' => 'success'));
行:bfnvny8b6#
发送json不需要RequestHandler。在控制器的操作中:
k4emjkb17#
从cakePHP 4.x.x开始,假设您的控制器和路由设置如下所示,下面的代码应该可以正常工作:控制器:<your_project_name>/src/控制器/学生控制器.php
路径:<your_project_name>/config/routes.php
运行bin/cake server并使用postman/unmomery或普通浏览器访问http://localhost:8765/students.json。有关设置Restful控制器和Restful路由的详细信息,请参阅相关文档
别忘了在 Postman 和失眠症上将方法设置为GET。
nkcskrwz8#
虽然我不是一个CakePHP大师,在我的情况下,我使用cake〉4,我需要通过 AJAX 调用的一些结果.为此,从我的控制器我写,
echo json_encode( Jmeter 盘::最近交易商());死亡;
在我的JS文件中,我只需要使用
解析(数据)
AJAX 的呼叫像