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:






