0

我正在尝试在 CakePHP 2.1 中开发一个简单的 web 服务。所以,我首先创建了一个数据库表:

CREATE TABLE IF NOT EXISTS `people` (
  `id` char(36) COLLATE utf8_bin NOT NULL,
  `first_name` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `last_name` varchar(100) COLLATE utf8_bin NOT NULL,
  `home_address` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `job_address` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `phone` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `fax` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `mail` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `birth_date` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

比我创建了一个简单的 Person 模型:

<?php
class Person extends AppModel {
    public $name = 'Person';
}

和各自的控制器:

<?php
class PeopleController extends AppController {
    public $components = array('RequestHandler');

    public function index() {      
        $people = $this->Person->find('all');
        $this->set(array(
            'people' => $people,
            '_serialize' => array('person')
        ));
    }
}

最后,在 routes.php 中,我映射了正确的 roote:

<?php
Router::mapResources('people');
Router::parseExtensions('json');
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';

但是当我尝试到达 ht_tp://localhost/cakephp/people.json 我得到:

<pre class="cake-error"><a href="javascript:void(0);" onclick="document.getElementById('cakeErr501541d86308c-trace').style.display = (document.getElementById('cakeErr501541d86308c-trace').style.display == 'none' ? '' : 'none');"><b>Notice</b> (8)</a>: Undefined index: person [<b>CORE\Cake\View\JsonView.php</b>, line <b>89</b>]<div id="cakeErr501541d86308c-trace" class="cake-stack-trace" style="display: none;"><a href="javascript:void(0);" onclick="document.getElementById('cakeErr501541d86308c-code').style.display = (document.getElementById('cakeErr501541d86308c-code').style.display == 'none' ? '' : 'none')">Code</a> <a href="javascript:void(0);" onclick="document.getElementById('cakeErr501541d86308c-context').style.display = (document.getElementById('cakeErr501541d86308c-context').style.display == 'none' ? '' : 'none')">Context</a><pre id="cakeErr501541d86308c-code" class="cake-code-dump" style="display: none;"><code><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;autoRender&nbsp;=&nbsp;false;</span></code>
<code><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;View&nbsp;=&nbsp;$View;</span></code>
<span class="code-highlight"><code><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;response-&gt;body($View-&gt;render($view,&nbsp;$layout));</span></code></span></pre><pre id="cakeErr501541d86308c-context" class="cake-context" style="display: none;">$view = null
$layout = null
$serialize = array(
    (int) 0 =&gt; &#039;person&#039;
)
$data = array()
$key = &#039;person&#039;</pre><pre class="stack-trace">JsonView::render() - CORE\Cake\View\JsonView.php, line 89
Controller::render() - CORE\Cake\Controller\Controller.php, line 957
Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php, line 193
Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php, line 161
[main] - APP\webroot\index.php, line 92</pre></div></pre>{"person":null}

错误在哪里?

4

2 回答 2

1

如您所见,您得到的响应是 HTML。它所说的(当您在浏览器中打开它时)是:

Notice (8): Undefined index: person [CORE\Cake\View\JsonView.php, line 89]
Code Context
JsonView::render() - CORE\Cake\View\JsonView.php, line 89
Controller::render() - CORE\Cake\Controller\Controller.php, line 957
Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php, line 193
Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php, line 161
[main] - APP\webroot\index.php, line 92
{"person":null}

您在数据库中是否有任何记录?还有这个方法的视图呢?它应该是这样的:

// app/View/People/json/index.ctp
<?php
echo json_encode(compact('people'));

请注意,index.ctp 文件位于json子文件夹中。查看有关JSON 和 XML 视图的书,如果有进一步的问题,请发表评论。

于 2012-07-30T08:00:48.460 回答
1

该错误清楚地表明您设置了 $serialize,而不是 $_serialize viewVar

像您自己在代码示例中一样使用“_serialize”。

还要确保要序列化的 var 与存在的 viewVar 匹配。

你序列化 $person,而你设置 $people

于 2012-07-30T08:24:53.503 回答