Desenvolvimento - PHP
Criando um novo tipo de find() no CakePHP 2.0
Após trabalhar num projeto onde a maior parte dos models eram de um campo “published”, desenvolvi a necessidade de criar um novo tipo de find(), o qual mostro para vocês neste artigo.
por Thiago BelemRecentemente comecei a trabalhar num projeto onde a maior parte dos models tem um campo “published”, que servirá para controlar qual conteúdo entra ou não no site externo… E eu não acho muito prático ficar colocando "published" => true em todas as conditions do site.
Foi aqui que tive a idéia de criar o $Model->find('published'), que funciona da mesma forma que o $Model->find('all') mas inclui a condição internamente.
A documentação é bem simples, e o resultado da minha implementação (que estou usando no meu projeto) é mais ou menos assim:
<?php App::uses('Model', 'Model'); class AppModel extends Model { /** * Métodos find * * @var array */ public $findMethods = array( # Métodos padrões 'all' => true, 'first' => true, 'count' => true, 'neighbors' => true, 'list' => true, 'threaded' => true, # Novos métodos 'published' => true ); /** * Encontra apenas registros publicados * * @param string $state The state of the query execution * @param array $query Query conditions * @param array $results Query results * * @return mixed */ protected function _findPublished($state, $query, $results = array()) { if ($state == 'after') return $results; if ($this->hasField('published')) $query['conditions'][$this->escapeField('published')] = true; return $query; } }
A lógica é bem simples, precisamos:
- Definir um método chamado “_findPublished” que será rodado antes e depois da consulta
- Retornamos os resultados encontrados caso ele tenha sido executado após a consulta ($state == after)
- Verificamos se o model tem uma coluna “published” e, caso tenha, incluímos a condição na $query
Agora eu posso buscar apenas os posts publicados de uma forma bem mais padronizada e elegante: $this->Post->find('published');
O método escapeField(field) (doc) recebe um nome de coluna e retorna no formato Model.coluna, no meu exemplo ficaria algo como Post.published.
Com isso você pode criar vários tipos de find, como por exemplo: $Model->find('active'), $Model->find('inactive') ou até $Model->find('urgent'), manipulando as condições extras internamente e deixando a sua aplicação muito mais organizada.
Não se esqueça que você pode criar um tipo de find pra todos os models (no AppModel) ou pra apenas um model, dentro dele.
E aí, gostou?
Artigo originalmente publicado por Thiago Belem: Criando um novo tipo de find() no CakePHP 2.0
Leia mais sobre o CakePHP: