Zend Framework – Extendendo classes
O Zend Framework é cheio de recursos (na maior parte das vezes, sobra), mas não quer dizer que estes sejam 100% ajustados a nossa necessidade. Quando nós olhamos pra fora (outros frameworks, linguagens), achamos coisas que gostaríamos que houvessem lá, mas, por enquanto, não existem. Solução: extendemos as classes!
Uma defesa clássica sobre extender classe é: nunca mexa no core! Claro! Você não vai sujeitar algo com 1 zilhão de commits e equipes desenvolvedoras as suas mãos falhas e exaltadas (nossa, que drama). A classe mais extendida, por ser a mais usada, é a classe do modelo: Zend_Db_Table. Quem já mexeu com Rails ou Cake sabe que faltam triggers de inserção ou validação, entre outras coisas.
Lá vem as pedras dizendo "já que tem que fazer, por que não migra logo pro outro?". Bom, vou ser rápido e responder que não vou discutir sobre isso.
Um exemplo de extensão e adição de triggers:
class Frk_Db_Table extends Zend_Db_Table { // dados da tabela protected $_data; /** * insere os dados validando os filtros * @param $data dados a serem inseridos na tabela * @return Integer Chave primaria da linha inserida */ public function insert($data) { try { $this->_data = $data; // valida filtros de eventos anteriores if (method_exists($this,'before')) { $this->before(); } if (method_exists($this,'beforeInsert')) { $this->beforeInsert(); } // insere os dados e retorna a OK return parent::insert($this->_data); } catch (Exception $e){ // trata o erro return FALSE; } } }
Neste exemplo o método insert foi extendido para disparar dois triggers, befor e beforeinsert. Tomei esses dois exemplos vindo de outros frameworks. Muitas vezes são úteis. Segue um exemplo de implementação.
class Usuario extends Frk_Db_Table { protected $_name = 'usuarios'; private function beforeInsert(){ $this->_data['adicionado_em'] = date("Y-m-d"); } }
Sempre que for utilizado o método insert, a classe usuário adiciona o campo adicionado_em. É uma boa maneira de se economizar código, especialmente nas views, neste caso. Eu, particularmente, também sempre extendo a classe Zend_Controller_Action, com métodos que auxiliam durante os requests.
Novo layout, nova idéia…
Além de ter achado esse tema legal pra mudar a cara do blog, daqui pra frente pretendo manter uma idéia diferente: já que eu não estou com tempo pra ficar produzindo coisa pra cá ainda, além dos planos daqui incluirem os screencasts (em breve), vou continuar postando o que eu achar de relevante com explicação por cima, pra não ficar com cara de "twittada".
Bom é isso aí.
Zend_Date e MySQL Timestamp
Precisava colocar um campo daqueles clássicos "atualizado em", em Timestamp do MySQL, num projeto em ZF.
Voilá:
... $now = new Zend_Date(); $info['update_at'] = $now->get(Zend_Date::W3C); ...