CakePHP 3将动作路由添加到索引或返回Null

时间:2016-11-15 20:52:27

标签: cakephp cakephp-3.0

我试图将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();

提前致谢。

1 个答案:

答案 0 :(得分:1)

除了序列化选项之外,你没有为视图设置任何变量,所以你得到null因为没有什么可序列化的,即你遗漏了像

这样的东西
$this->set(compact('note', 'message'));

在你的行动中。

如果没有资源路由,/notes的请求会映射到Notes控制器的索引操作,因为这是连接回退路由的方式,没有操作=索引操作。

另见