quinta-feira, 17 de julho de 2014

Custom find types no CakePHP

Minha primeira opinião sobre o recurso não foi positiva, achei desnecessário, mais fácil fazer um método qualquer do que criar um tipo de busca.

Até que um pouco mais tarde encontrei utilidade com o PaginateComponent. Esse monta a busca dinamicamente e nesse processo passa os parâmetros recebidos para ORM do cake, nesse caso não havia outra forma de customizar a busca se não fosse com custom find types.

Nota: Usar os hooks mais genéricos, afterFind e beforeFind, não eram uma boa saída para o meu caso, mas o funcionaria com o PaginateComponent.

Sem mais delongas a receita:

Model

Adicionar atributo
public $findMethods = array('nameCustomType' =>  true);
Criar método
protected function _findNameCustomType($state, $query, $results = array()) {
        if ($state === 'before') {
            $query['conditions']['Article.published'] = true;
            return $query;
        }
        return $results;
    }
O cake chama esse método duas vezes, alternando a variável state. Quando ele passa no state before temos que retornar a query, caso contrario retornar results.

No model isso é o bastante.

Já no paginate a manha está em usar um índice no mesmo nível que fields ou conditions no array de configurações especificando o tipo de busca. Ex.:

 $this->paginate = array(  
   'ModelName' => array(  
     'findType' => 'nameCustomType'  
   )  
 );  
 $this->paginate('ModelName',$filter);  

Com isso o paginate vai executar o hook criado.

Eu achei a interação muito boa, em total harmonia com o PaginateComponent, vale a pena usar.

Cheers!

Nenhum comentário:

Postar um comentário