我为CakePHP设置了REST,我遇到了一些问题。当调用GET方法时,比如我的控制器上的视图或索引,或者甚至是GET的自定义方法,我都没有问题得到答案。但是当我尝试像添加一样执行POST操作时,即使我可以看到它已正确到达并执行(保存到数据库),但操作中没有输出。
我已正确设置JSON和XML输出的布局文件以及每种输出类型的路由和视图。
编辑:
beforeFilter
中AppController
的相关代码:
if ( $this->RequestHandler->isAjax() ) {
$this->layout = 'ajax';
$this->autoRender = false;
} elseif ($this->RequestHandler->isXml()) {
$this->layout = 'default';
$this->RequestHandler->respondAs('xml');
$this->RequestHandler->renderAs($this, 'xml');
} elseif ($this->RequestHandler->ext == 'json') {
$this->layout = 'default';
$this->RequestHandler->respondAs('json');
$this->RequestHandler->renderAs($this, 'json');
} elseif ($this->RequestHandler->accepts('html')) {
$this->layout = 'frontend';
}
路线中的代码:
Router::mapResources('fonykers');
Router::mapResources('voicenotes');
Router::parseExtensions();
add
中的FonykersController
方法中的相关代码:
$response = array('ok' => true, 'title' => 'Thank you for registering', 'msg' => 'A confirmation email has been sent to the provided email address, please click on the link in the email to complete the registration process');
if ($this->RequestHandler->isXml()) {
$this->set(compact('response'));
} else if ($this->RequestHandler->ext == 'json') {
pr('This prints');
$this->set(compact('response')); //View not being outputted
pr('This also prints');
} else {
echo json_encode($response);
}
我在/views/fonykers/json
<?php echo json_encode(array('response' => $response)); ?>
我的json的布局文件:
<?php
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
header('Content-Type: application/json');
header("X-JSON: ".$content_for_layout);
echo $content_for_layout;
?>
答案 0 :(得分:2)
你还有一些事情要发生......
您的beforeFilter检查isAjax,然后使用elseif
来测试XML或JSON。如果您的请求是AJAX,它将永远不会进入XML / JSON测试。您的布局可能根本没有设置,只留下$this->autoRender = false;
。
由于autoRender已禁用,因此在某些时候您必须手动调用渲染。使用$this->set()
只是准备在视图中使用的变量 - 它实际上不会输出视图。在您的控制器操作中,实际输出任何内容的唯一行是echo json_encode($response);
。
使用$this->render()
强制Cake在您需要时渲染视图。 The 1.3 Book: Rendering a specific view
顺便说一下,有时您使用...}elseif(...
,有时您使用...}else if(...
。这在技术上并不是错误的,但保持一致将使您的代码更容易阅读。