フレームワークの拡張
AdonisJSのアーキテクチャは、フレームワークを拡張非常に簡単になっています。私たちは、フレームワークのコアAPIを使用して、第一級のパッケージのエコシステムを構築しています。
このガイドでは、パッケージまたはアプリケーションのコードベース内でフレームワークを拡張するために使用できるさまざまなAPIを探っていきます。
マクロとゲッター
マクロとゲッターは、クラスのプロトタイプにプロパティを追加するためのAPIを提供します。これらは、Object.defineProperty
のシンタックスシュガーと考えることができます。内部的には、macroableパッケージを使用しており、詳細な技術的な説明については、そのREADMEを参照してください。
マクロとゲッターは実行時に追加されるため、追加されたプロパティの型情報をTypeScriptに伝えるためにdeclaration mergingを使用する必要があります。
マクロを追加するためのコードは、専用のファイル(extensions.ts
のような)に記述し、サービスプロバイダのboot
メソッド内でそれをインポートできます。
export default class AppProvider {
async boot() {
await import('../src/extensions.js')
}
}
次の例では、RequestクラスにwantsJSON
メソッドを追加し、同時にその型を定義しています。
import { Request } from '@adonisjs/core/http'
Request.macro('wantsJSON', function (this: Request) {
const firstType = this.types()[0]
if (!firstType) {
return false
}
return firstType.includes('/json') || firstType.includes('+json')
})
declare module '@adonisjs/core/http' {
interface Request {
wantsJSON(): boolean
}
}
declare module
の呼び出し時のモジュールパスは、クラスをインポートする際に使用するパスと同じである必要があります。interface
の名前は、マクロまたはゲッターを追加するクラスの名前と同じである必要があります。
ゲッター
ゲッターは、クラスに追加される遅延評価されるプロパティです。Class.getter
メソッドを使用してゲッターを追加できます。第一引数はゲッターの名前であり、第二引数はプロパティの値を計算するためのコールバック関数です。
ゲッターのコールバック関数は非同期にすることはできません。なぜなら、JavaScriptのgettersは非同期にできないからです。
import { Request } from '@adonisjs/core/http'
Request.getter('hasRequestId', function (this: Request) {
return this.header('x-request-id')
})
// プロパティは次のように使用できます。
if (ctx.request.hasRequestId) {
}
ゲッターはシングルトンにすることもできます。つまり、ゲッターの値を計算する関数は一度だけ呼び出され、返り値はクラスのインスタンスごとにキャッシュされます。
const isSingleton = true
Request.getter('hasRequestId', function (this: Request) {
return this.header('x-request-id')
}, isSingleton)
マクロ可能なクラス
以下は、マクロとゲッターを使用して拡張できるクラスのリストです。
クラス | インポートパス |
---|---|
Application | @adonisjs/core/app |
Request | @adonisjs/core/http |
Response | @adonisjs/core/http |
HttpContext | @adonisjs/core/http |
Route | @adonisjs/core/http |
RouteGroup | @adonisjs/core/http |
RouteResource | @adonisjs/core/http |
BriskRoute | @adonisjs/core/http |
ExceptionHandler | @adonisjs/core/http |
MultipartFile | @adonisjs/core/bodyparser |
モジュールの拡張
ほとんどのAdonisJSモジュールは、カスタムの実装を登録するための拡張可能なAPIを提供しています。以下は、同じものの集約されたリストです。