Skip to main content

INTRODUÇÃO

O ORM permite o uso de hooks pra "pendurar" funcionalidades nas classes sem ter que alterar o código das classes-base.

Por exemplo, existem hooks que podem ser usados para validar um objeto ANTES de efetivamente salvá-lo no DB.

Esses hooks são métodos que a classe principal (Pessoa, por exemplo) deve fazer um override em cima do respectivo método da classe base. O método base, em geral, não faz nada, e existe simplesmente pra permitir essa extensão.

Por exemplo:

//CLASSE BASE DO ORM
abstract class DefaultDBObject extends CustomDefaultPatternObject implements DatabaseObjectInterface {
protected function preSaveObject() : bool {
$this->checkForNonDuplicationOnSave(static::$nonDuplicateFields);
return true;
}
}

//CLASSE CONCRETA QUE ESTENDE A CLASSE-BASE
class Pessoa extends PessoaBase {
protected function preSaveObject() : bool {
//FAZ ALGUMA VALIDAÇÃO E RETORNA TRUE/FALSE;
return parent::preSaveObject();
}
}

HOOKS

preSaveObject()

protected function preSaveObject() : bool;

É a primeira coisa que é executada quando se tenta salvar um objeto (UPDATE ou INSERT).

Se retornar false, a operação é abortada.

Usado geralmente pra fazer alguma checagem de duplicidade de registros, validação ou popular "de última hora" algum campo (data de alteração, por exemplo).

validateObjBeforeSaving()

protected function validateObjBeforeSaving() : bool;

Executado após as validações automáticas do ORM terem sido feitas (e após o preSaveObject), mas antes de executar query no DB.

Aqui você já tem certeza que os campos têm tamanho válido, por exemplo.

postSaveRecord()

protected function postSaveRecord() : bool;

Executado após uma operação de UPDATE/INSERT ter sido executada com sucesso, mas ANTES de se fazer commit no DB.

Se o método retornar false é feito um rollback na transaction.

preDelete()

protected function preDelete() : bool;

É a primeira coisa que é executada quando se tenta excluir um objeto.

Se retornar false, a operação é abortada.

Usado geralmente pra fazer "checagens gerais" antes de excluir objetos, assim como "excluir com segurança objetos relacionados" (objetos ligados por foreign keys).

postDelete()

protected function postDelete() : bool;

Executado após uma operação de UPDATE/INSERT ter sido executada com sucesso. Por <motivos inexplicáveis>, a operação de DELETE não está protegida por transaction automaticamente, então não há rollback.

Se o método retornar false, nada de especial acontece. Mas deveria.

canBeEdited()

public function canBeEdited() : bool;

Método que é executado quando chega um request para "acessar/editar" um determinado objeto.

Pode ser usado pra checar se o usuário ter permissão pra acessar aquele resource.