こんにちは。キューでWebエンジニアをしている永井です。
今回は、Strapiのバックエンド実装で共通処理をまとめる方法を紹介します。
Strapiのバックエンド実装では、API毎にコントローラーやサービスを用意してビジネスロジックを使い回すことができます。ですが、APIに紐付かない共通処理をまとめる方法に苦労したので記事にしようと思います。
コントローラー、サービス、その他バックエンド実装の詳細はこちら。
前提
Strapiの開発環境は構築済みの想定で進めていきます。
まだの方は以下を参考に開発環境の構築をお願いします。
環境
strapi 4.4.5
Node 16.14.2
共通処理をまとめる
共通処理は、/config
にファイルを作成して実装します。/config
のファイルはStrapi起動時に自動的に読み込まれ、どこからでも呼び出すことができます。
呼び出しはstrapi.config.<ファイル名>.<関数名>
で可能です。
ファイルの作成
/config
にファイルを作成します。
ファイル名の指定はありませんが、今回はfunctions.js
で作成します。
ファイルの編集
/config/functions.js
を編集します。
関数をmodule.exports
で呼び出せるようにします。
module.exports = {
hoge: () => {
// 共通処理
return 'hoge';
},
};
今回の例の場合、こちらで呼び出すことができます。
strapi.config.functions.hoge();
// strapi.config.<ファイル名>.<関数名>
// ファイル名: functions
// 関数名 : hoge
共通処理の呼び出し
共通処理の準備ができたので、実際に呼び出してみます。
コレクション(コンテンツのデータ構造)を作成し、コントローラーを編集して呼び出します。
コレクションの作成
Strapiの管理画面から「Content-Type Builder → Create new collection type」を選択して作成します。
Articleコレクションを作成しました。
APIも有効にしておきます。「Setting → Roles → Public」から有効にできます。
コントローラーの編集
コレクションを作成すると、/src/api
にバックエンド実装用のフォルダとファイルが追加されます。
その中のコントローラーのファイルを編集します。
共通処理を呼び出して、APIのレスポンスに含めてみます。
今回は/api/articles
のレスポンスに含めたいので、find
の関数を定義(オーバーライド)します。
"use strict";
/**
* article controller
*/
const { createCoreController } = require("@strapi/strapi").factories;
module.exports = createCoreController("api::article.article", ({ strapi }) => ({
async find() {
const { data, meta } = await super.find(ctx);
// 共通処理の値を付与して返す
meta.hoge = strapi.config.functions.hoge();
return { data, meta };
}
}));
APIを呼び出してみます。
$ curl http://localhost:1337/api/articles
{"data":[],"meta":{"pagination":{"page":1,"pageSize":25,"pageCount":0,"total":0},"hoge":"hoge"}}
レスポンスにmeta.hoge
が含めれていることを確認できました!
無事に共通処理を呼び出せています。
まとめ
共通処理をまとめられると実装も楽になるのでぜひ活用してください。/config
配下に置くのは若干の違和感がありますが、良しとしましょう。。