我是CakePHP的新手。不用说我不知道从哪里开始阅读。阅读有关AJAX和JSON响应的几个页面,我能理解的是,我需要使用Router::parseExtensions()
和RequestHandlerComponent
,但没有一个我可以阅读的示例代码。
我需要的是调用函数MyController::listAll()
并以Model::find('all')
格式返回JSON
,以便我可以将它与JS一起使用。
我需要View
吗?
该视图应该在哪个文件夹中?
它应该有什么扩展?
我在哪里放Router::parseExtension()
和RequestHandlerComponent
?
// Controller
public function listAll() {
$myModel = $this->MyModel->find('all');
if($this->request->is('ajax') {
$this->layout=null;
// What else?
}
}
答案 0 :(得分:4)
我不知道你读了什么,但我想这不是the official documentation。官方文档包含如何执行此操作的示例。
class PostsController extends AppController {
public $components = array('RequestHandler');
public function index() {
// some code that created $posts and $comments
$this->set(compact('posts', 'comments'));
$this->set('_serialize', array('posts', 'comments'));
}
}
如果使用.json扩展名调用该操作,则会返回json,如果使用.xml调用它,则会返回xml。
如果您需要或仍需要,您仍然可以创建视图文件。 Its as well explained on that page
// Controller code
class PostsController extends AppController {
public function index() {
$this->set(compact('posts', 'comments'));
}
}
// View code - app/View/Posts/json/index.ctp
foreach ($posts as &$post) {
unset($post['Post']['generated_html']);
}
echo json_encode(compact('posts', 'comments'));
答案 1 :(得分:1)
// Controller
public function listAll() {
$myModel = $this->MyModel->find('all');
if($this->request->is('ajax') {
$this->layout=null;
// What else?
echo json_encode($myModel);
exit;
// What else?
}
}
你必须在echo之后使用exit,并且你已经使用了layout null,这样就可以了。
您不必为此使用View,您希望使用组件。那么你可以从控制器本身做到这一点,它没有任何问题!
Iinjoy
答案 2 :(得分:0)
在Cakephp 3.5中,您可以发送json响应,如下所示:
//在控制器中
public function XYZ() {
$this->viewBuilder()->setlayout(null);
$this->autoRender = false;
$taskData = $this->_getTaskData();
$data = $this->XYZ->getAllEventsById( $taskData['tenderId']);
$this->response->type('json');
$this->response->body(json_encode($data));
return $this->response;
}
答案 3 :(得分:0)
尝试一下:
public function listAll(){
$this->autoRender=false;
$output = $this->MyModel->find('all')->toArray();
$this->response = $this->response->withType('json');
$json = json_encode($output);
$this->response = $this->response->withStringBody($json);
}