sexta-feira, 18 de julho de 2014

PHP empty function

Hoje comecei a me questionar se a função empty do php é realmente útil. Depois de perder um tempo para perceber que 0 é empty na opinião do php, decidi que vou abolir o uso desta.

Não acho que tenha sido um mistério essa descoberta, pois na documentação do empty é explicito que essas situações são consideradas empty:
  • "" (an empty string) 
  • 0 (0 as an integer)
  • 0.0 (0 as a float)
  • "0" (0 as a string)
  • NULL
  • FALSE
  • array() (an empty array)
  • $var; (a variable declared, but without a value)
Eu só não concordo com a terceira. Zero sem sobra de dúvidas é um valor!

Como alternativa faço a seguinte sugestão:

Cheers!

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!