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 Belem



Recentemente 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:

  1. Definir um método chamado “_findPublished” que será rodado antes e depois da consulta
  2. Retornamos os resultados encontrados caso ele tenha sido executado após a consulta ($state == after)
  3. 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:

Thiago Belem

Thiago Belem - Tenho 23 anos e trabalho com Desenvolvimento WEB há mais de 10 anos. Atualmente moro no Rio de Janeiro e, além de trabalhar como Freelancer, sou Professor no Assando Sites, meu curso online de CakePHP.