Carlos Gustavo (The Froskie) Internet, web, www…

29set/090

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.

Comentários (0) Trackbacks (0)

Sem comentários


Deixar um comentário


Sem trackbacks