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();
结果
当我通过 /expenses/getMonthlyExpenses/3.json
直接访问 Action 控制器时。我只是得到一个 null
响应 json/application
contentType.
当我访问调用视图元素的模板时 - /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 接受变量名或名称数组 => 变量。
我是 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();
结果
当我通过
/expenses/getMonthlyExpenses/3.json
直接访问 Action 控制器时。我只是得到一个null
响应json/application
contentType.当我访问调用视图元素的模板时 -
/finance/expenses/index
,它也 returnsnull
。
谢谢, 任何帮助,将不胜感激。我确信我忽略了一些非常简单的事情。
我有一个类似的应用程序 运行 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 接受变量名或名称数组 => 变量。