CakePHP: JSON w widokach

Pomysł jak i klasa do realizacji pomysłu są zaczerpnięte z tego wpisu. Jeżeli mamy akcję, której zadaniem jest zwrócić wynik w JSON; zazwyczaj nie ma potrzeby korzystania z plików widoków i layoutów. Niektórzy pokusiliby się o wyłączenie autorenderowania i następnie wpisali echo json_encode($something);.Bardziej doświadczeni programiście wiedzą, że jest to niezgodne z architekturą MVC. Do tego celu stworzona została klasa JsonView. Poniższy kod ląduje w pliku app/views/json.php.

class JsonView extends View {
  var $content = null;
  function __construct(&$controller, $register = true) {
    if (is_object($controller) && isset($controller->viewVars['json'])) {
      $this->content = $controller->viewVars['json'];
    }
    if ($register) {
      ClassRegistry::addObject('view', $this);
    }
    Configure::write('debug', 0);
  }
 
  function render($action = null, $layout = null, $file = null) {
    if ($this->content === null) {
      $data = '';
    } else {
      $data = json_encode($this->content);
    }
    return $data;
  }
}

Teraz w naszej akcji, której zadaniem jest wypisać obiekt JSON wystarczy wpisać:

function my_action() {
    $this->view='json';
    $json = array('myobject'=>true,'mvc'=>'not broken');
    $this->set(compact($json));
}

W odpowiedzi akcji powinniśmy otrzymać:

{"myobject":true,"mvc":"not broken"}

Mechanizm bardzo prosty w implementacji, pozwalający znacząco przyspieszyć pisanie kodu z użyciem JSON.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *