Ошибка REST CakePHP 2.0 - PullRequest
       1

Ошибка REST CakePHP 2.0

1 голос
/ 07 ноября 2011

У меня есть простая настройка приложения 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}

Заранее спасибо! -Michael

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Проблема в том, что при использовании $ 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
        )
    )
)
1 голос
/ 10 ноября 2011

Я не понимаю почему, но этот код работает ...

в вашем xml / index.ctp:

<?php $xml = Xml::build(array('offers' => array('offer' => $offers))); echo $xml->saveXML(); ?>
0 голосов
/ 08 ноября 2011

Когда вы говорите, что получаете доступ через /controller/index.xml, вы имеете в виду GET /offers.xml, верно? В любом случае, мне трудно понять, что не так с предоставленной информацией. Не могли бы вы показать код на routes.php и /xml/index.ctp?

Редактировать: «Произошла внутренняя ошибка» не похоже на ошибку PHP, но трассировка предполагает, что она была. Не могли бы вы подтвердить, что это единственная информация, которую вы получаете об ошибке? Кроме того, кажется, что есть проблема с функцией Xml::fromArray, не могли бы вы показать код в действии index?

...