使用CakePHP进行简单的AJAX / JSON响应

时间:2014-01-20 23:12:18

标签: ajax json cakephp cakephp-2.0

我是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?

    }
}

4 个答案:

答案 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);

 }