CakePHP 1,3 - вызов JSON REST не отображается правильно - PullRequest
1 голос
/ 29 февраля 2012

Я следовал этому руководству , чтобы настроить мой веб-сервис REST для JSON и XML.XML выводится правильно, но когда я выполняю вызов JSON, я получаю отображение не найденного представления из Cake.

Для этого я добавил следующий код в свой AppController:

     if ( $this->RequestHandler->isAjax() ) {
        //Configure::write ( 'debug', 0 );
        $this->layout = 'ajax';
        $this->autoRender = false;      
      } elseif  ($this->RequestHandler->isXml()) {
        $this->layout = 'default';      
        //Configure::write ( 'debug', 0 );
      } elseif ($this->RequestHandler->ext == 'json') { 
        $this->RequestHandler->setContent('json','text/x-json');  
        $this->layout = 'default';      
      } elseif ($this->RequestHandler->accepts('html')) {
        $this->layout = 'frontend';     
      }

И этопример кода в одном из моих методов контроллера:

      if ($this->RequestHandler->isXml()) {
        $voicenote = $voicenote['Voicenote'];
        $this->set(compact('voicenote'));
      } else if ($this->RequestHandler->ext == 'json') {
        $voicenote = $voicenote['Voicenote'];
        pr($voicenote);
        echo json_encode(array('voicenote' => $voicenote));                                                                                                                                             
      } else {
        $this->set(compact('voicenote', 'tiny_list'));                                                                                                                                                  
      }

XML отображается правильно, проблема заключается только в JSON.

1 Ответ

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

Проблема заключается в том, что автоматический рендеринг отключен только в том случае, если запрос выполняется с помощью запроса AJAX.При вводе адреса в адресной строке браузера, после вызова echo json_encode(); контроллер продолжит работу в конвейере рендеринга, ища шаблон действия и макет для вывода.


Я бы предложилсогласован между вашим рендерингом XML и JSON и выводится как через файлы шаблонов, так и не отключает autoRender для запросов AJAX.

AppController:

if  ($this->RequestHandler->isXml()) { // Allow a json request to specify XML formatting
  $this->RequestHandler->respondAs('xml'); // for setting headers
  $this->RequestHandler->renderAs($this, 'xml'); // for specifying templates for rendering
} elseif ($this->RequestHandler->ext == 'json'|| $this->RequestHandler->isAjax()){ // 'action' ajax requests and all 'action.json' requests receive JSON
  $this->RequestHandler->respondAs('json');
  $this->RequestHandler->renderAs($this, 'json');
}
// Other requests will fall through to the default HTML rendering

Контроллеру необходимо только установить данные, и каждыйшаблон представления будет форматировать его по мере необходимости:

function action() {
  // ...
  $voicenote = $voicenote['Voicenote'];
  $this->set(compact('voicenote', 'tiny_list'));                                                                                
}

Шаблоны JSON будут относительно простыми, создавать их в соответствии с требованиями сообщений об ошибках.
Макет:

<?php echo $content_for_layout; ?>

JSON Action (app / views / контроллер / json / action .ctp)

<?php echo json_encode(array('voicenote' => $voicenote)); ?>

Ознакомьтесь с документацией CakePHP RequestHandler , чтобы узнать большепомощь

...