Estendendo o Core
O AdonisJs é totalmente extensível ao core.
Neste guia, aprendemos como estender partes do framework.
Onde escrever código
A maneira mais fácil de começar é usar ganchos de aplicativos, e somente depois mover o código para dentro de um provedor se você quiser compartilhar seu código como um pacote.
Os ganchos ficam dentro do arquivo start/hooks.js e podem ser usados para executar código em um momento específico no ciclo de vida do aplicativo:
// .start/hooks.js
const { hooks } = require('@adonisjs/ignitor')
hooks.after.providersRegistered(() => {
// execute your code
})OBSERVAÇÃO
Os retornos de chamada de gancho são síncronos. Você deve criar um provedor e usar o método boot para escrever código assíncrono.
Os provedores vivem dentro do diretório providers na raiz do projeto:
├── providers
├── AppProvider.jsSeus provedores devem ser registrados dentro do arquivo start/app.js:
// .start/app.js
const path = require('path')
const providers = [
path.join(__dirname, '..', 'providers/AppProvider')
]Os provedores são geralmente usados para adicionar funcionalidade ao seu aplicativo vinculando namespaces ao contêiner IoC, no entanto, você também pode usar provedores para executar código personalizado quando inicializado:
const { ServiceProvider } = require('@adonisjs/fold')
class AppProvider extends ServiceProvider {
async boot () {
// execute code
}
}Adicionando macros/getters
As macros permitem que você adicione métodos a classes existentes.
Uma classe deve estender a classe Macroable para ser estendida por meio de macros.
DICA
Use hooks ou o método boot de um provedor para adicionar macros.
Por exemplo, se uma macro fosse definida assim:
const Response = use('Adonis/Src/Response')
const Request = use('Adonis/Src/Request')
Response.macro('sendStatus', function (status) {
this.status(status).send(status)
})Ela poderia então ser usada da seguinte forma:
Route.get('/', ({ response }) => {
response.sendStatus(200)
})Da mesma forma, você também pode adicionar getters às suas classes macroáveis:
Request.getter('time', function () {
return new Date().getTime()
})
// Or add a singleton getter
Request.getter('id', function () {
return uuid.v4()
}, true)Abaixo está a lista de classes às quais você pode adicionar getters/macros:
Provedores de extensão
Alguns provedores existentes permitem que você os estenda adicionando novas funcionalidades.
Por exemplo, o Provedor de sessão permite que novos drivers sejam adicionados, enquanto o Provedor de autenticação permite novos serializadores e esquemas.
NOTA
Consulte a documentação de provedores individuais para entender seus recursos de extensão.
Para manter a interface de extensão unificada e simples, use o método Ioc.extend para adicionar novos drivers ou serializadores:
const { ioc } = require('@adonisjs/fold')
const { hooks } = require('@adonisjs/ignitor')
hooks.after.providersRegistered(() => {
ioc.extend('Adonis/Src/Session', 'mongo', function () {
return class MongoDriver {
}
})
})Se você estiver desenvolvendo um provedor e quiser usar a mesma interface para expor recursos de extensão, certifique-se de vincular um objeto Manager da seguinte forma:
const { ServiceProvider } = require('@adonisjs/fold')
class MyProvider extends ServiceProvider {
register () {
this.app.manager('MyApp/Provider', {
extend: function () {
}
})
}
}- O objeto do gerenciador deve ter um método
extend. Os valores passados paraioc.extendserão encaminhados para este método. - O
namespacedeve ser o mesmo que o namespace de vinculação. - Você deve gerenciar o registro/ciclo de vida de seus drivers.