サービスプロバイダ

サービスプロバイダ

サービスプロバイダは、アプリケーションのさまざまなフェーズでアクションを実行するためのライフサイクルメソッドを持つプレーンなJavaScriptクラスです。

サービスプロバイダは、コンテナにバインディングを登録したり、既存のバインディングを拡張したり、HTTPサーバーの起動後にアクションを実行したりできます。

サービスプロバイダは、AdonisJSアプリケーションのエントリーポイントであり、アプリケーションが準備完了と見なされる前にアプリケーションの状態を変更する能力を持っています。

プロバイダは、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() {
// クリーンアップを実行する
}
}