サービスプロバイダ
サービスプロバイダは、アプリケーションのさまざまなフェーズでアクションを実行するためのライフサイクルメソッドを持つプレーンなJavaScriptクラスです。
サービスプロバイダは、コンテナにバインディングを登録したり、既存のバインディングを拡張したり、HTTPサーバーの起動後にアクションを実行したりできます。
サービスプロバイダは、アプリケーションが準備完了と見なされる前にアプリケーションの状態を変更するためのエントリーポイントです。主に外部パッケージがアプリケーションライフサイクルにフックするために使用されます。
もし、クラスの中で依存関係を注入したいだけなら、依存性注入機能を使用できます。
プロバイダは、adonisrc.tsファイルのproviders配列内に登録されます。値はサービスプロバイダを遅延インポートするための関数です。
{
providers: [
() => import('@adonisjs/core/providers/app_provider'),
() => import('./providers/app_provider.js'),
]
}
デフォルトでは、プロバイダはすべてのランタイム環境でロードされます。ただし、特定の環境でのみプロバイダを実行することもできます。
{
providers: [
() => import('@adonisjs/core/providers/app_provider'),
{
file: () => import('./providers/app_provider.js'),
environment: ['web', 'repl']
}
]
}
サービスプロバイダの作成
サービスプロバイダは、アプリのprovidersディレクトリ内に格納されます。または、node ace make:provider appコマンドを使用することもできます。
プロバイダモジュールは、プロバイダクラスを返すexport defaultステートメントを持つ必要があります。クラスのコンストラクタは、Applicationクラスのインスタンスを受け取ります。
参照: プロバイダ作成コマンド
import { ApplicationService } from '@adonisjs/core/types'
export default class AppProvider {
constructor(protected app: ApplicationService) {
}
}
以下は、さまざまなアクションを実行するために実装できるライフサイクルメソッドです。
export default class AppProvider {
register() {
}
async boot() {
}
async start() {
}
async ready() {
}
async shutdown() {
}
}
register
registerメソッドは、プロバイダクラスのインスタンスが作成された後に呼び出されます。registerメソッドでは、IoCコンテナ内にバインディングを登録できます。
registerメソッドは同期的なので、このメソッド内ではPromiseを使用することはできません。
export default class AppProvider {
register() {
this.app.container.bind('db', () => {
return new Database()
})
}
}
boot
bootメソッドは、すべてのバインディングがIoCコンテナに登録された後に呼び出されます。このメソッド内では、コンテナからバインディングを解決して拡張/変更できます。
export default class AppProvider {
async boot() {
const validator = await this.app.container.make('validator')
// カスタムのバリデーションルールを追加
validator.rule('foo', () => {})
}
}
バインディングがコンテナから解決されたときにバインディングを拡張するのは良い習慣です。たとえば、バリデータにカスタムルールを追加するためにresolvingフックを使用できます。
async boot() {
this.app.container.resolving('validator', (validator) => {
validator.rule('foo', () => {})
})
}
start
startメソッドは、bootメソッドの後およびreadyメソッドの前に呼び出されます。readyフックアクションで必要なアクションを実行できます。
ready
readyメソッドは、アプリケーションの環境に基づいて異なるステージで呼び出されます。
web |
readyメソッドは、HTTPサーバーが起動してリクエストを受け付ける準備ができた後に呼び出されます。 |
console |
readyメソッドは、メインコマンドのrunメソッドの直前に呼び出されます。 |
test |
readyメソッドは、すべてのテストを実行する直前に呼び出されます。ただし、テストファイルはreadyメソッドよりも前にインポートされます。 |
repl |
readyメソッドは、REPLプロンプトがターミナル上に表示される前に呼び出されます。 |
export default class AppProvider {
async start() {
if (this.app.getEnvironment() === 'web') {
}
if (this.app.getEnvironment() === 'console') {
}
if (this.app.getEnvironment() === 'test') {
}
if (this.app.getEnvironment() === 'repl') {
}
}
}
shutdown
shutdownメソッドは、AdonisJSがアプリケーションを正常に終了している最中に呼び出されます。
アプリケーションの終了イベントは、アプリが実行されている環境とアプリケーションプロセスの開始方法によって異なります。詳細については、アプリケーションライフサイクルガイドを参照してください。
export default class AppProvider {
async shutdown() {
// クリーンアップを実行する
}
}