我试图将JSON传递给我的控制器的Add()动作,但我得到的响应是来自Index()动作的响应或“null”取决于我的routes.php中的条目(如下所示)。
我正在使用Firefox插件RESTClient来测试/将json传递给我的行为:
方法:发布
网址 http://MyApp/notes.json(我的理解是这应该调用基于cakephp docs的添加操作)
JSON:
{
"post_id":"123",
"note":"hello world"
}
当我在routes.php中有以下内容时,响应为“null”
Router::scope('/', function ($routes) {
$routes->extensions(['json']);
$routes->resources('Notes');
从此作用域中删除$routes->resources('Notes');
将返回索引操作的响应,并在响应中返回Notes模型中的所有项目。
此外,当我通过api前缀中的Crud.Add实现此功能时,我得到了有效的结果。据说试图在我的routes.php中理解我的错误,或者添加可能导致null或路由到索引操作的操作。
添加操作:
public function add()
{
$note = $this->Notes->newEntity();
if ($this->request->is('post')) {
$note = $this->Notes->patchEntity($note, $this->request->data);
if ($this->Notes->save($note)) {
$message = 'Saved';
} else {
$message = 'Error';
}
}
$this->set('_serialize', ['note', 'message']);
}
routes.php文件:
<?php
use Cake\Core\Plugin;
use Cake\Routing\Router;
Router::defaultRouteClass('DashedRoute');
Router::extensions(['json'], ['xml']);
Router::prefix('api',function($routes) {
$routes->extensions(['json','xml']);
$routes->resources('Notes');
});
Router::scope('/', function ($routes) {
$routes->extensions(['json']);
$routes->resources('Notes');
$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
$routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
$routes->fallbacks('DashedRoute');
});
Plugin::routes();
提前致谢。
答案 0 :(得分:1)
除了序列化选项之外,你没有为视图设置任何变量,所以你得到null
因为没有什么可序列化的,即你遗漏了像
$this->set(compact('note', 'message'));
在你的行动中。
如果没有资源路由,/notes
的请求会映射到Notes
控制器的索引操作,因为这是连接回退路由的方式,没有操作=索引操作。
另见