JSON CakePHP 3.5 中的响应

JSON response in CakePHP 3.5

我是 CakePHP 框架的新手。一段时间以来,我一直被困在一个问题上。

我正在努力使 json 响应有效。我已经在此处阅读了有关如何操作的教程:JSON and XML views in CakePHP。但是,它仍然无法解决我的问题。

这是我的代码:

在我的控制器中 - App\Controller\ExpensesController

public function getMonthlyExpenses($month = null) {

    $expenses = $this->Expenses->find('all'); 

    $this->set(compact($expenses, $month)); 

    $this->set('_serialize', array("expenses", "month"));   

}

我在视图元素中调用 getMonthlyExpenses - /src/Template/Element/Chart/expenseChart.ctp

<script>
    $.ajax({
        url: '/finance/expenses/getMonthlyExpenses/3.json',
        accepts: 'application/json', 
        async: false, 
        success: function(data) {
            console.log("data" + data);
        }, 
     error: function() {
        console.log("there was an error");
    }
});
</script>

在我的配置中 - `Routes.php' 我有

<?php

use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;


Router::defaultRouteClass(DashedRoute::class);

Router::scope('/', function (RouteBuilder $routes) {

    $routes->extensions(['json']);
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);


    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);


    $routes->fallbacks(DashedRoute::class);

});


Plugin::routes();

结果

  1. 当我通过 /expenses/getMonthlyExpenses/3.json 直接访问 Action 控制器时。我只是得到一个 null 响应 json/application contentType.

  2. 当我访问调用视图元素的模板时 - /finance/expenses/index,它也 returns null

谢谢, 任何帮助,将不胜感激。我确信我忽略了一些非常简单的事情。

我有一个类似的应用程序 运行 CakePHP 3.5,这是我的路由文件的示例,也许您错过了什么。我的略有不同,因为我的 REST api 位于插件中。

Router::plugin('Api', ['path' => '/publisher/], function (RouteBuilder $routes) {
        $routes->extensions(['json']);
        $routes->fallbacks('DashedRoute');
    }
);

尝试将您的 AJAX 请求端点从 getMonthlyExpenses 更改为 get-monthly-expenses 或 get_monthly_expenses,我相信这就是您的问题所在。

也可以通过在控制器函数的开头简单地做一个骰子 ('hello world') 来尝试更多调试。

另外尝试设置结果的不同方式:

public function getMonthlyExpenses($month = null) {

    $expenses = $this->Expenses->find('all'); 

    $this->set(compact($expenses, $month)); 

    $this->set('_serialize', true);   

}

尝试改变:

$this->set(compact($expenses, $month));

$this->set(compact("expenses", "month"));

看起来 compact function 接受变量名或名称数组 => 变量。