1

我有一个简单的 CakePHP 2.0 应用程序设置。我按照书中的简单说明在此处设置简单的 REST 服务:http: //book.cakephp.org/2.0/en/development/rest.html

但是,当我尝试通过 /controller/index.xml 访问时,我收到无效输入和错误:发生内部错误。使用以下堆栈

Trace:
#0 /var/www/yoyo/lib/Cake/Utility/Xml.php(87): Xml::fromArray(Array, Array)
#1 /var/www/yoyo/app/View/Offers/xml/index.ctp(3): Xml::build(Array)
#2 /var/www/yoyo/lib/Cake/View/View.php(598): include('/var/www/yoyo/a...')
#3 /var/www/yoyo/lib/Cake/View/View.php(365): View->_render('/var/www/yoyo/a...')
#4 /var/www/yoyo/lib/Cake/Controller/Controller.php(898): View->render(NULL, NULL)
#5 /var/www/yoyo/lib/Cake/Routing/Dispatcher.php(114): Controller->render()
#6 /var/www/yoyo/lib/Cake/Routing/Dispatcher.php(89): Dispatcher-    >_invoke(Object(OffersController), Object(CakeRequest), Object(CakeResponse))
#7 /var/www/yoyo/app/webroot/index.php(96): Dispatcher->dispatch(Object(CakeRequest),      Object(CakeResponse))
#8 {main}

提前致谢!-迈克尔

4

3 回答 3

2

问题在于,当使用 $this->Model->find() 时,您会以这种形式传递每个模型和关联模型:

Array
(
[0] => Array
    (
        [MainModel] => Array
        (
                [id] => 1
                [name] => foo
        )
        [AssocModelOne] => Array
        (
                [id] => 23
                [name] => bar
        )
        [AssocModelTwo] => Array
        (
                [id] => 87
                [name] => baz
        )
    )
)

XML 解析器不希望将数字视为数组的顶层。但它也只想看到一个顶级项目。当您像下面这样传递多个时,最终会出现“无效输入”500 错误:

Array
(
    [MainModel] => Array
    (
        [id] => 1
        [name] => foo
    )

    [AssocModelOne] => Array
    (
        [id] => 23
        [name] => bar
    )

    [AssocModelTwo] => Array
    (
        [id] => 87
        [name] => baz
    )
)

这个数组是行不通的。为了让它以这种方式工作,您必须在使用它之前将数据放在另一个被认为是“顶级”的数组中,否则它将失败。所以它应该看起来更像:

Array
(
[ModelData] => Array
    (
        [MainModel] => Array
        (
            [id] => 1
            [name] => foo
        )

        [AssocModelOne] => Array
        (
            [id] => 23
            [name] => bar
        )

        [AssocModelTwo] => Array
        (
            [id] => 87
            [name] => baz
        )
    )
)
于 2012-02-15T08:09:07.603 回答
1

我不明白为什么,但这段代码有效......

在您的 xml/index.ctp 中:

<?php $xml = Xml::build(array('offers' => array('offer' => $offers))); echo $xml->saveXML(); ?>
于 2011-11-10T17:29:35.627 回答
0

当你说你通过/controller/index.xml你的意思访问时GET /offers.xml,对吧?无论如何,我很难弄清楚所提供的信息有什么问题。你能在你的routes.phpand上显示代码/xml/index.ctp吗?

编辑:“发生内部错误”看起来不像是 PHP 错误,但跟踪表明存在错误。您能否确认这是您获得的有关该错误的唯一信息?另外,该功能似乎有问题Xml::fromArray,您能否在 index 操作中显示代码?

于 2011-11-07T22:41:40.847 回答