我试图从cakephp 3.1控制器函数返回json。我的问题是,无论我对_serialize标志做什么,响应始终是缺少视图模板文件。
在蛋糕文档中,如果您不需要使用模板来格式化响应,它会设置_serialize标志。 Cake Docs on View _serialize
以下是客户端初始化过程的Javascript
function save_activity( mod, act, resp ) {
$.ajax({
method: 'POST',
url: '/activities/saveActivity',
data: {
'module' : "example1",
'activity_name' : "example2",
'response' : "example3"
},
dataType: 'json',
error: function( xhr, status, error ){
alert( status + error );
},
success: function( data, status, xhr ){
alert( status + data.success );
}
});
}
从客户端处理json的Controller代码。
public function saveActivity()
{
$user = $this->Auth->user();
//This line does not seem to do anything
//$this->request->input('json_decode', 'true');
//Debugger::log($this->request->data);
$activityTable = TableRegistry::get('Activities');
$activity = $activityTable->newEntity();
$activity->user_id = $user['id'];
$activity->module = $this->request->data('module');
$activity->activity_name = $this->request->data('activity_name');
$activity->response = $this->request->data('response');
//These lines do not have any effect
//$this->RequestHandler->renderAs($this, 'json');
//$this->response->type('application/json');
//$this->viewBuilder()->layout(null);
//$this->render(false);
$msg = '';
if ($activityTable->save($activity)) {
$msg = 'Activity Stored';
} else {
$msg = 'Activity Not Stored';
}
$this->set(['response' => $msg]);
//comment or uncomment this line and it makes no difference
//as it still returns a json response about a missing template.
$this->set('_serialize', true);
}
包含或删除_serialize标志时收到的错误消息。
“模板文件”页面\ json \ module1 \ activity4.ctp“缺失。”
任何人都对这些机制有任何见解?我找到的解决方法是包含模板文件......但是这意味着我必须生成几十个基本上空的模板文件来处理这个调用生成的所有地方。
请帮忙吗?
答案 0 :(得分:1)
问题原因: - 违反假设。
我的假设是saveActivity方法正在执行。虽然现实是AuthComponent未能允许访问该方法并且正在运行默认处理程序,但正在查找默认视图模板......并且失败。
我通过devTools查看返回页面中附加到错误消息的堆栈轨道,从而发现了这一点。我还应该通过一些简单的跟踪日志记录调用来验证这个假设。当我评论出" $ this-> set(' _serialize',true)时,我已经有了线索;"并没有改变。
然后简单的解决方案是在控制器beforeFilter:
中授权该方法 public function beforeFilter(Event $event)
{
parent::beforeFilter($event);
$this->Auth->allow('saveActivity');
$this->Auth->allow('getActivity');
$this->eventManager()->off($this->Csrf);
}
感谢协助ndm。