Eventos
AdonisJs tem um lindo Event Emitter para emitir e ouvir eventos com suporte para geradores ES2015, curingas e um diretório dedicado para armazenar/gerenciar ouvintes.
Sobre eventos
Os eventos são definidos dentro do arquivo
bootstrap/events.js.Os ouvintes de eventos podem ser definidos como Closures ou você pode vincular um namespace de contêiner IoC.
jsEvent.on('user.registered', function * (user) { }) // OU Event.on('user.registered', 'User.registered')O diretório
app/Listenersé dedicado para armazenar ouvintes de eventos.Ao vincular ouvintes aos eventos, você não precisa inserir o namespace inteiro. Por exemplo, um ouvinte armazenado como
app/Listeners/User.jsserá referenciado comoUser.<method>.Use o comando
make:listenerpara criar um novo ouvinte de eventos.bash./ace make:listener User # create: app/Listeners/User.js
Configuração
A configuração do provedor de eventos é armazenada dentro do arquivo config/events.js. Por baixo dos panos, o AdonisJs usa EventEmitter 2 e implementa todas as opções de configuração disponíveis.
Exemplo básico
Vamos percorrer um exemplo básico de envio de um e-mail de boas-vindas a um usuário recém-registrado usando o provedor de eventos. Começaremos configurando uma rota e usaremos o UsersController para disparar o evento após criar um novo usuário.
// app/Http/routes.js
'use strict'
const Route = use('Route')
Route.post('users', 'UsersController.store')// bootstrap/events.js
'use strict'
const Event = use('Event')
Event.when('user.registered', 'User.sendWelcomeEmail') <1>// app/Http/Controllers/UsersController.js
'use strict'
const Event = use('Event')
const User = use('App/Model/User')
class UsersController {
* store (request, response) {
const user = yield User.create(userDetails)
Event.fire('user.registered', user.toJSON()) <2>
}
}// app/Listeners/User.js
'use strict'
const Mail = use('Mail')
const User = exports = module.exports = {}
User.sendWelcomeEmail = function * (user) {
yield Mail.send('emails.welcome', user, message => {
message.to(user.email, user.firstname)
message.from('awesome@adonisjs.com')
message.subject('Welcome to the Kitten\'s World')
})
}- Primeiro, precisamos registrar um ouvinte para o evento.
- O método
UsersController.storedisparará o evento user.registered e passará o usuário recém-criado.
Métodos de Evento
Abaixo está a lista de métodos disponíveis expostos pelo Provedor de Eventos.
when(event, [name], listener)
Registre um ouvinte para um determinado evento. Você também pode definir um nome opcional para um ouvinte, que pode ser usado para removê-lo mais tarde.
Event.when('user.registered', 'Mail.sendWelcomeEmail')Event.when('user.registered', function * () {
// ...
})Event.when('user.registered', 'registration', 'User.sendWelcomeEmail')Aliases
| Alias | Exemplo |
|---|---|
| listen | Event.listen('user.registered', function * () {}) |
| on | Event.on('user.registered', function * () {}) |
once(event, handler)
Funciona da mesma forma que when, mas é executado apenas uma vez.
Event.once('app.boot', function * () {
// ...
})any(handler)
Anexa um ouvinte de evento global para ouvir todos os eventos.
Event.any(function (event) {
console.log(event)
})times(number)
Define um limite para as vezes que um ouvinte de evento será executado e será removido depois disso.
Event.times(4).when('user.registered', function () {
// I will be executed 4 times only
})fire(event, data)
Dispara um evento.
Event.fire('user.registered', user)Aliases
| Alias | Exemplo |
|---|---|
| emit | Event.emit('user.registered', user) |
removeListeners([event])
Remove todos os ouvintes de um evento fornecido ou de todos os eventos.
Event.removeListeners() // irá remover todos os ouvintes
Event.removeListeners('user.registered') // removerá ouvintes somente para eventos user.registeredremoveListener(event, name)
Remove um ouvinte nomeado para um evento fornecido.
// registrar vários
Event.when('user.registered', 'Logger.log')
Event.when('user.registered', 'registration', 'Mail.sendWelcomeEmail')
// remover um específico
Event.removeListener('user.registered', 'registration')hasListeners(event)
Retorna um booleano se um evento tem ouvintes ou não.
Event.hasListeners('user.registered')getListeners(event)
Retorna uma matriz de ouvintes para um evento específico.
Event.getListeners('user.registered')Instância do emissor
Todos os ouvintes de eventos têm acesso à instância do emissor.
Event.when('user.registered', function () {
console.log(this.emitter)
})