フレームワークの拡張

フレームワークの拡張

AdonisJSのアーキテクチャは、フレームワークを拡張非常に簡単になっています。私たちは、フレームワークのコアAPIを使用して、第一級のパッケージのエコシステムを構築しています。

このガイドでは、パッケージまたはアプリケーションのコードベース内でフレームワークを拡張するために使用できるさまざまなAPIを探っていきます。

マクロとゲッター

マクロとゲッターは、クラスのプロトタイプにプロパティを追加するためのAPIを提供します。これらは、Object.definePropertyのシンタックスシュガーと考えることができます。内部的には、macroableパッケージを使用しており、詳細な技術的な説明については、そのREADMEを参照してください。

マクロとゲッターは実行時に追加されるため、追加されたプロパティの型情報をTypeScriptに伝えるためにdeclaration mergingを使用する必要があります。

マクロを追加するためのコードは、専用のファイル(extensions.tsのような)に記述し、サービスプロバイダのbootメソッド内でそれをインポートできます。

providers/app_provider.ts
export default class AppProvider {
async boot() {
await import('../src/extensions.js')
}
}

次の例では、RequestクラスにwantsJSONメソッドを追加し、同時にその型を定義しています。

src/extensions.ts
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')
})
src/extensions.ts
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を提供しています。以下は、同じものの集約されたリストです。