jsonajaxcakephpcakephp-3.3

CakePHP 3 - Can't return proper json when debug mode = true


I'm new to stackoverflow, and I've just started to play around with CakePHP 3.

I've run into a weird problem:

I'm sending an ajax-request (form submit) to the controller, and I expect to get a proper json-response back. It works fine when I set debug mode to false in config/app.php, but when it's set to true, I get an error-message in the browsers console, and the responsetext seem to be html. I'm calling the action with the .json extension in the url.

I've linked screenshot of the console where the first response is with debug mode set to false, and the second set to true:

enter image description here

I have enabled the extensions in config/routes.php:

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

Here's the controller-code:

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']);
    }
}

Here's the model code:

 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;
}

I hope I've given you enough information so that you can help me solve this.

CakePHP version: 3.3.2


Solution

  • Looking at the bit of output that is visible in the screenshot

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

    that HTML is output generated by the debug() function.

    Look closely at your model code, and you should spot the call to the function. Remove it, and you should be good.

    btw, the source of the call can be found in the first <span> element in the <div>, so if you experience similar problems in the future make sure to check that.