Hooks
Hooks são ações executadas antes ou depois dos eventos do ciclo de vida do banco de dados.
Usar hooks de modelo ajuda a manter sua base de código DRY, fornecendo injeção de código de ciclo de vida conveniente de onde quer que seus hooks sejam definidos.
Um exemplo clássico de hook é hashing a senha do usuário antes de salvá-lo em um banco de dados.
Definindo Hooks
Hooks podem ser definidos em um arquivo de classe de modelo por meio de um fechamento ou referenciando qualquer manipulador file.method no diretório app/Models/Hooks.
Encerramento de Vinculação
const Model = use('Model')
const Hash = use('Hash')
class User extends Model {
static boot () {
super.boot()
this.addHook('beforeCreate', async (userInstance) => {
userInstance.password = await Hash.make(userInstance.password)
})
}
}
module.exports = UserGancho Dentro de Transações
Para usar ganchos dentro de transações basta adicionar o segundo parâmetro trx no fechamento de gancho
const Model = use('Model')
const Hash = use('Hash')
class User extends Model {
static boot () {
super.boot()
this.addHook('beforeCreate', async (userInstance, trx) => {
// here you can use transaction object `trx`
})
}
}
module.exports = UserNo exemplo acima, o fechamento beforeCreate é executado ao criar um modelo User para garantir que a senha do usuário seja criptografada antes de ser salva.
Arquivo de Gancho
O AdonisJs tem um diretório app/Models/Hooks dedicado para armazenar ganchos de modelo.
Use o comando make:hook para criar um arquivo de hook:
adonis make:hook User# .Output
✔ create app/Models/Hooks/UserHook.jsAbra o novo arquivo UserHook.js e cole o código abaixo:
// .app/Models/Hooks/UserHook.js
'use strict'
const Hash = use('Hash')
const UserHook = exports = module.exports = {}
UserHook.hashPassword = async (user) => {
user.password = await Hash.make(user.password)
}Com um hook file.method definido, podemos remover o fechamento em linha do nosso exemplo anterior e, em vez disso, referenciar o arquivo de hook e o método como:
const Model = use('Model')
class User extends Model {
static boot () {
super.boot()
this.addHook('beforeCreate', 'UserHook.hashPassword')
}
}
module.exports = UserAbortando operações de banco de dados
Os hooks podem abortar operações de banco de dados lançando exceções:
// .app/Models/Hooks/UserHook.js
UserHook.validate = async (user) => {
if (!user.username) {
throw new Error('Username is required')
}
}Eventos do ciclo de vida
Abaixo está a lista de eventos do ciclo de vida do banco de dados disponíveis para conectar:
| Evento | Descrição |
|---|---|
beforeCreate | Antes de criar um novo registro. |
afterCreate | Após um novo registro ser criado. |
beforeUpdate | Antes de atualizar um registro. |
afterUpdate | Após um registro ter sido atualizado. |
beforeSave | Antes de criar ou atualizar um novo registro. |
afterSave | Após um novo registro ter sido criado ou atualizado. |
beforeDelete | Antes de remover um registro. |
afterDelete | Após um registro ser removido. |
afterFind | Após um único registro ser buscado do banco de dados. |
afterFetch | Após o método fetch ser executado. O método hook recebe uma matriz de instâncias de modelo. |
afterPaginate | Após o método paginate ser executado. O método hook recebe dois argumentos: uma matriz de instâncias de modelo e os metadados de paginação. |