Com o crescimento do uso de AJAX, da maioria dos frameworks de JavaScript (jQuery, Prototype, mooTools, YUI, ExtJS, …) e de uma dúvida no Groups do Google (Action que renderize apenas o layout, sem necessidade de uma view), resolvi escrever um post falando sobre como usar JSON no CakePHP de forma automática para retorno dos dados, sem precisar gerar um arquivo de view para cada action e que não fere o MVC.
A Solução
Para solucionar o caso, achei que o melhor jeito seria criando uma classe de View nova. A classe View do CakePHP ela sempre procura um arquivo de view, além do template. Com a nova classe, seria feita a renderização ali mesmo, sem a necessidade de novos arquivos.
A classe que criei (JsonView) pode ser baixada aqui. Ela deve ser colocada na pasta views de da sua aplicação (nenhuma sub-pasta) com o nome de json.php. Ou seja, no final, você terá o caminho app/views/json.php.
Como Usar
Para usar é bem simples. No seu controller, quando você for retornar um código em JSON, basta alterar a variável $view do controller para usar a nova classe. Além disso, os dados que você quer que retorne, devem ser setados com o nome ‘json‘ no seu controller. Caso não seja, ele vai renderizar normalmente. Exemplo de uso no controller:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class UsuariosController extends AppController { var $uses = array('Usuario', 'Grupo'); function index($json = false) { $this->set('usuarios', $this->Usuario->find('list')); if ($json) { $this->view = 'Json'; $this->set('json', 'usuarios'); } } function multilista($json = false) { $this->set('usuarios', $this->Usuario->find('list')); $this->set('grupos', $this->Grupo->find('list')); if ($json) { $this->view = 'Json'; $this->set('json', array('usuarios', 'grupos')); } } } |
Neste caso, quando o parâmetro de index não for true, ele vai renderizar como se fosse uma requisição normal. Caso passe como true, ele irá renderizar como JSON. Já no método multilista, além do parâmetro para verificar se é JSON, ele passa um array de variáveis para a view JSON, assim a classe irá renderizar mais de uma variável.
Outra maneira de se fazer é definir a variável $view da classe diretamente com ‘Json’ (assim como foi feito com $uses no exemplo). Assim, sempre que você der um set na variável ‘json’, a classe da View se liga e renderiza em json, caso contrário mantém o normal.
Conclusão
Este é um método fácil e rápido de renderizar as requisições JSON, sem precisar criar um arquivo para cada requisição e sem precisar de muito código (tanto no controller, quanto na view).
O código que fiz, é compatível com PHP 4 e 5, então é possível usar com o CakePHP sem medo em qualquer versão de PHP.
Abraços e bom uso.
Dicas são sempre bem vindas.
[...] Gostei da forma como o Juan Basso trabalha para renderizar objetos JSON através do CakePHP. Ficou bem limpa e da conta do recado. Segue o link do post falando sobre isso: http://blog.cakephp-brasil.org/2008/09/11/trabalhando-com-json-no-cakephp-12/ [...]
Pingback por Meio Código » Blog Archive » Trabalhando com JSON no CakePHP 1.2 — 12 setembro 2008 @ 7:46 am
Amigo,
Percebi que sua classe gera o JSON com mime-type text/x-json. De acordo com este blog (http://blog.sbw.be/2006/07/13/json-mime-type/) o mime-type correto é application/json. Inclusive tem um link pra uma RFC que fala isso.
Tô comentando aqui pra você verificar a veracidade da informação e se necessário, corrigir a classe.
Comentário por Vinicius Mendes — 22 setembro 2008 @ 6:00 pm
Obrigado pela informação, Vinicius. Corrigi a classe e já está disponível. Eu conhecia como text/x-json mesmo, vi até em alguns fóruns e blog pela internet. Mas como está na RFC usar application/json, vamos corrigir, pois é ela que manda.
Abraços.
Comentário por Juan Basso — 26 setembro 2008 @ 1:53 pm
Amigo, o link esta quebrado, verifique por favor…
Abraço
Comentário por Rock — 5 janeiro 2009 @ 11:08 am
Obrigado por informar. Havia atualizado o wordpress e acabei esquecendo de mover os uploads. Agora estão todos OK.
Comentário por Juan Basso — 5 janeiro 2009 @ 1:16 pm