Ошибка REST CakePHP 2.0

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

Заранее спасибо! -Майкл


person Michael    schedule 07.11.2011    source источник


Ответы (3)


Проблема в том, что при использовании $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
        )
    )
)
person Jouva Moufette    schedule 15.02.2012

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

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

<?php $xml = Xml::build(array('offers' => array('offer' => $offers))); echo $xml->saveXML(); ?>
person Pablo Bayarri    schedule 10.11.2011

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

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

person luchomolina    schedule 07.11.2011
comment
Спасибо за ваш ответ, да, это offer.xml, в route.php я добавил: Router::mapResources(array('offers','categories')); Router::parseExtensions(); мой xml/index.ctp: $xml = Xml::build($offers); эхо $xml-›asXML(); также в моей индексной функции OffersController: $offers = array('Offers' =› $this-›Offer-›find('all')); $this-›set(compact('предложения')); - person Michael; 08.11.2011
comment
После добавления некоторых данных я теперь получаю кучу ошибок DOMDocument::createElement(), и String не может быть проанализирован как XML, за которым следует внутренняя ошибка. - person Michael; 08.11.2011
comment
Ваше действие с индексом кажется мне странным, но я не могу сказать, что это проблема. На всякий случай измените его на: function index() { $offers = $this->Offer->find('all'); $this->set(compact('offers')); } - person luchomolina; 08.11.2011
comment
Я только что заметил, что вы делаете echo $xml->asXML();, и я думаю, что вы предполагаете, что $xml является экземпляром XmlHelper? Так это или нет, правда в том, что $xml является результатом Xml::build($offers), который может быть экземпляром SimpleXMLElement или DOMDocument, и ни один из них не имеет метода asXML(). Пожалуйста, используйте echo $xml->saveXML();, как предлагает документация. - person luchomolina; 08.11.2011