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.