O componente Zend_Db_Table possui diversos mecanismos interessantes que poucas pessoas conhecem. Neste post irei falar da classe Zend_Db_Table_Row e a lógica de persistência.
Para isto é necessário extender a classe Zend_Db_Table_Row e configura-la na table pelo atributo $_rowClass
ou usando o método $table->setRowClass($className)
. A row fornece 6 métodos em branco para serem sobrescritos de acordo com a necessidade. Para cada uma das operações insert, update e delete, existe um método que é executado antes e outro depois.
- _insert
- executado antes do insert
- _postInsert
- executado após o insert
- _update
- executado antes do update
- _postUpdate
- executado após o update
- _delete
- executado antes do delete
- _postDelete
- executado após o delete
class User extends Zend_Db_Table_Row { /** * Criptografa a senha do usuário. * * @param string $password * @return string */ static public function makePassword($password) { return md5($password); } /** * Executa antes de inserir a row. * */ protected function _insert() { // define o grupo de usuario padrao $this->role = 'member'; // seta a data de registro usando uma expressao do banco de dados $this->register_date = new Zend_Db_Expr('NOW()'); // armazena a senha com md5 $this->password = self::makePassword($this->password); } /** * Executa antes de atualizar a row. * */ protected function _update() { /** * Se a senha foi alterada, precisa criptografar novamente. * Verifica isso usando o array $_cleanData que contém os dados do banco * sem alterações. */ // a senha atual é diferente da que estava no banco? if ($this->_cleanData['password'] != $this->password) { // criptografa a nova senha $this->password = self::makePassword($this->password); } } } class Users extends Zend_Db_Table { protected $_rowClass = 'User'; }
Com a lógica definida, basta usar tranquilamente de qualquer forma que a table permite. Seja utilizando os métodos da table ou da row, a lógica sempre será executada.
$users = new Users(); // criando um usuario $user = $users->createRow(); $user->username = 'deco'; $user->password = '12345'; $user->save(); // insert // atualizando $user->password = 'novasenha'; $user->save(); // update // inserindo usando metodos da table $user2 = array( 'password' => '4321', 'username' => 'joselito' ); $users->insert($user2);
Utilizar este componente corretamente ajuda a diminuir os riscos de bugs da aplicação. Estas operações são garantidas também no relacionamento de tabelas, assunto que irei falar no próximo post da série.