CakePHP 3 - 当debug mode = true时,无法返回正确的json

时间:2016-08-26 12:39:00

标签: json ajax cakephp cakephp-3.3

我是stackoverflow的新手,我刚开始玩CakePHP 3。

我遇到了一个奇怪的问题:

我正在向控制器发送一个ajax请求(表单提交),我期望得到一个正确的json响应。它在config / app.php中将调试模式设置为false时工作正常,但是当它设置为true时,我在浏览器控制台中收到错误消息,而responsetext似乎是html。我在url中调用了.json扩展名的操作。

我已将控制台的屏幕截图链接到第一个响应,其中调试模式设置为false,第二个设置为true:

enter image description here

我在config / routes.php中启用了扩展名:

Router::scope('/', function (RouteBuilder $routes) {
    $routes->extensions(['json', 'xml']);
(...)

这是控制器代码:

public function getUserStats() {
    $this->log($this->request->data, 'debug');

    if (($this->request->is('post'))) {
        $this->log('getCategories(): Post-request is received.', 'info');

        $usersTable = TableRegistry::get('Users');
        $q = $usersTable->find('statsByUsers', $this->request->data);
        $users = $q->all();

        // Calculating total amount per user.               
        foreach ($users as $u) {
            foreach ($u->purchases as $p) {
                $u->total += $p->total;
            }
        }

        $this->log($users, 'debug');

        $this->set('users', $users);
        $this->set('_serialize', ['users']);
    }
}

以下是型号代码:

 public function findStatsByUsers(Query $query, array $options) {
    debug($options);
    $options['dates'] = $this->getConvertedDates($options);
    $query
        ->contain([
            'Purchases' => function($q) use($options) {
                return $q
                    ->select(['id', 'total' => 'amount * count', 'purchase_date', 'user_id'])
                    ->where(['purchase_date BETWEEN :fromDate AND :toDate',])
                    ->bind(':fromDate', $options['dates']['fromDate'], 'datetime') // Binds the dates to the variables in where-conditions
                    ->bind(':toDate', $options['dates']['toDate'], 'datetime');
            }
                ])
            ->where([
                'Users.id IN ' => $options['users'],
                'Users.active' => true
        ]);

    return $query;
}

我希望我已经给了你足够的信息,以便你可以帮我解决这个问题。

CakePHP版本:3.3.2

2 个答案:

答案 0 :(得分:0)

<?php

use Cake\Core\Configure;

// your class ,...

public function getUserStats() {

        $this->log($users, 'debug');

        Configure::write('debug',false); // DISABLE

        $this->set('users', $users);
        $this->set('_serialize', ['users']);
}

答案 1 :(得分:0)

查看屏幕截图中可见的输出位

<div class="cake-debug-output"> ...

HTML是由debug()函数生成的输出。

仔细查看您的型号代码,您应该发现对该功能的调用。删除它,你应该是好的。

顺便说一下,调用的来源可以在<span>的第一个<div>元素中找到,所以如果您将来遇到类似的问题,请务必检查一下。