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.