Eventos
O AdonisJs vem com um Event Provider dedicado.
Internamente, ele usa o pacote EventEmitter2, com outras funcionalidades convenientes adicionadas a ele.
O Event Provider tem uma implementação fake, que pode ser usada para asserções ao escrever testes.
Visão geral dos eventos
- Os ouvintes de eventos são definidos dentro do arquivo
start/events.js
. - Os ouvintes de eventos podem ser definidos como closures, ou você pode vincular um namespace do contêiner IoC:
Event.on('new::user', async (user) => {
})
// OU
Event.on('new::user', 'User.registered')
- Os ouvintes de eventos com namespace são armazenados dentro do diretório
app/Listeners
. - Ao vincular ouvintes a eventos, você não precisa inserir o namespace inteiro. Por exemplo, um ouvinte armazenado como
app/Listeners/User.js
é referenciado comoUser.<method>
. - O comando
make:listener
pode ser usado para criar novos ouvintes de eventos:
adonis make:listener User
# Saída:
✔ create app/Listeners/User.js
Exemplo básico
Digamos que queremos emitir um evento toda vez que um usuário se registra em nosso site e, dentro de um ouvinte de eventos, enviar um e-mail para o usuário registrado.
Primeiro, precisamos criar a rota e o controlador relevantes:
// .start/routes.js
Route.post('register', 'UserController.register')
// .app/Controllers/Http/UserController.js
const Event = use('Event')
class UserController {
register () {
// register the user
Event.fire('new::user', user)
}
}
Em seguida, precisamos de um ouvinte para o evento new::user
para que possamos enviar o e-mail.
Para fazer isso, crie um arquivo events.js
dentro do diretório start
:
# Mac / Linux
> touch start/events.js
# Windows
> type NUL > start/events.js
Finalmente, escreva nosso código de manipulação de eventos dentro do arquivo start/events.js
:
const Event = use('Event')
const Mail = use('Mail')
Event.on('new::user', async (user) => {
await Mail.send('new.user', user, (message) => {
message.to(user.email)
message.from('from@email')
})
})
Como você pode ver, o AdonisJs facilita o uso da palavra-chave await
dentro do retorno de chamada do ouvinte de eventos.
API
Abaixo está a lista de métodos que podem ser usados para interagir com o Provedor de Eventos.
on(event, listener)
Vincule um ou vários ouvintes para um determinado evento. O listener
pode ser uma função de fechamento ou referência a uma (ou muitas) ligações de contêiner IoC:
Event.on('new::user', async () => {
})
// IoC container binding
Event.on('new::user', 'User.registered')
// Array of listeners
Event.on('new::user', ['Mailer.sendEmail', 'SalesForce.trackLead'])
when(event, listener)
O método when
é um alias do método on.
once(event, listener)
O mesmo que on, mas chamado apenas uma vez:
Event.once('new::user', () => {
console.log('executed once')
})
onAny(listener)
Vincular listener para qualquer evento:
Event.onAny(function () {
})
// Ioc container binding
Event.onAny('EventsLogger.track')
times(number)
O método times
é encadeado com on
ou when
para limitar o número de vezes que o listener deve ser disparado:
Event
.times(3)
.on('new::user', () => {
console.log('fired 3 times')
})
emit(event, data)
Emitir um evento com dados opcionais:
Event.emit('new::user', user)
fire(event, data)
O método fire
é um alias do método emit.
removeListener(event, listener)
Remove listener(s) para um evento dado:
Event.on('new::user', 'User.registered')
// later remove it
Event.removeListener('new::user', 'User.registered')
NOTA
Você deve vincular uma referência de contêiner IoC para removê-lo mais tarde.
off(event, listener)
O método off
alias o método removeListener.
removeAllListeners(event)
Remove todos os ouvintes para um evento dado:
Event.removeAllListeners()
listenersCount(event)
Retorna o número de ouvintes para um evento dado:
Event.listenersCount('new::user')
getListeners(event)
Retorna uma matriz de ouvintes para um evento dado:
Event.getListeners('new::user')
hasListeners(event)
Retorna um booleano
indicando se há algum ouvinte para um evento dado:
Event.hasListeners('new::user')