See also:
モデル生成ツールでモデルを作成したら、それをカスタマイズできます。 コマンドラインツールを使ったり、モデル定義JSONファイルを編集したり、JavaScriptのコードを追加したりすることで、カスタマイズ可能です。
コマンドラインツールによるカスタマイズ
Note: 既存のモデルをモデル生成ツールで変更することはできません。しかし、コマンドラインツールを使えば、ある程度のカスタマイズが可能です。以下をご覧ください。
モデルを最初に作成したあとで、~コマンドラインツール~を使ってカスタマイズすることができます。以下のことが可能です。
- プロパティ生成ツール を使って、モデルにプロパティを追加する。
- リレーション生成ツール を使って、 モデル間のリレーションを追加する。
- ACL生成ツール を使って、モデルに アクセス制御 を追加する。
JSONを使ってモデルをカスタマイズする
common/models
にあるモデル定義JSONファイル (例えば customer.json
) を単純に編集することで、
幾つもの側面をカスタマイズできます。既定の状態は以下のようになっています。
{
"name": "myModel",
"base": "PersistedModel",
"properties": {
// Properties listed here depend on your responses to the CLI
},
"validations": [],
"relations": {},
"acls": [],
"methods": []
}
LoopBack はこれらの基本モデルに対して、モデルJSONファイルの設定を_追加する_。 多くの場合とても簡単ですが、ACL設定に関しては、何らかのACL設定が他のものに優先されることがあるため、複雑になることがあります。 詳細は、 ACLルール優先順位 を参照してください。
他のモデルを拡張する
Userのようなビルトインモデルや、アプリケーションのカスタムモデルのいずれかについて、モデルを拡張したり、既存のモデルを「継承」したりすることができます。 モデル生成ツール を使ってこれらのことを実施するには、「モデルの基本クラスを選択してください」と尋ねられたときに、単に希望するモデルを選択します。 代わりに、拡張したいモデル名のモデル定義JSONファイルを編集して、「base」プロパティを設定することもできます。
Note:
一般的に、MySQLやMongoDBといったデータベースにデータを保存したい場合は、基本モデルとして PersistedModel
を使います。
Model
は、CRUD操作を持たないモデル、例えばSOAPやRESTのようなコネクタを使用する場合に使います。
例えば以下は、組み込みのUserモデルを拡張した、Customerモデルを定義している customer.json
ファイルの抜粋です。
{
"name": "Customer",
"base": "User",
"idInjection": false,
...
一般的に、この方法では組み込みモデル以外のあらゆるモデルを拡張できます。
Important:
現在は、組み込みモデルの必須プロパティを変更することはできません。もしそうする必要がある場合、それらの置き換えとして独自のモデルを作成してください。
一つの基本独自モデルを拡張した独自モデルを作ることができます。
例えば、自分で定義したMyBaseModel
を拡張して MyModel
というモデルを定義するには、 モデル生成ツール を使って MyModel を作り、
JSONファイル common/models/MyModel.json
を以下のように編集します。
{
"name": "Example",
"base": "MyBaseModel",
}
モデルを拡張する時に、新しいプロパティを追加できます。例えば以下のように。
{
"name": "Customer",
"base": "User",
"properties": {
"favoriteMovie": {
"type": "string"
}
}
}
サポートしているデータ型については、LoopBackの型 を参照してください。
他のモデル設定のカスタマイズ
カスタマイズできる最も重要な設定が幾つかあります。
- plural(複数形) - 標準的な複数形の形を使う代わりに、独自の文字列を使用する場合に設定します。
- strict(厳密な) - 事前に定義されたプロパティだけを持つインスタンスしか、保存できないようにする場合にtrueを設定します。 保存・更新の操作において、追加のプロパティはデータソースに永続化されません。既定では false です。
- idInjection(ID注入) - モデルに、自動的に id プロパティを追加するかどうかを設定します。既定では true です。
- http.path - REST エンドポイントの HTTP パスをカスタマイズします。
詳細は、モデル定義JSONファイル を参照してください。
JavaScript でモデルをカスタマイズする
プログラム的にモデルを拡張する基本的な方法は、 common/models/
ディレクトリにある、モデルのJavaScriptファイルを編集することです。
例えば、「customer」モデルには、 common/models/customer.js
があります(モデルをモデル生成ツール
で作成した場合)。
このスクリプトは、モデルが定義された後、すぐに実行されます。
これは、モデルの設定や登録に使われるので、モデル定義の一部とみなすことができます。
モデルの関係・複雑な検証・幾つかのプロパティに関する既定の関数など、基本的にJSONではできないことでも可能です。
しかし、この時点ではスクリプトはappインスタンスにはアクセス出来ないことに注意してください。
リモートメソッド や、運用フックを追加することで、モデルを拡張することもできる。
もし、REST経由でメソッドを公開したくない場合、単に remoteMethod()
の呼出しをやめるだけでできます。
JavaScriptを使ってモデルをカスタマイズする方法については、 アプリケーションロジックを追加する を参照してください。 サポートしているデータ型については、 LoopBackの型 を参照してください。
組み込みメソッドの実装を変更する
サーバ起動スクリプト経由
モデルを永続的なデータソースに紐付けると、それは、PersistedModelを拡張した 永続化モデル となり、
LoopBackは自動的にCRUD操作用の組み込みメソッド一式を追加します。
しばしば、その実装を変更したいと思うでしょう。/server/boot
ディレクトリ内のJavaScriptファイルを使うとこれができます。
例えば、以下のコードは、組み込みの find()
メソッドを上書きするために
Note.find()
を再実装する方法を示しています。
module.exports = function(app) {
var Note = app.models.Note;
var find = Note.find;
var cache = {};
Note.find = function(filter, cb) {
var key = '';
if(filter) {
key = JSON.stringify(filter);
}
var cachedResults = cache[key];
if(cachedResults) {
console.log('serving from cache');
process.nextTick(function() {
cb(null, cachedResults);
});
} else {
console.log('serving from db');
find.call(Note, function(err, results) {
if(!err) {
cache[key] = results;
}
cb(err, results);
});
}
}
}
モデルのスクリプト経由
common/models
ディレクトリのJavaScriptを使うこともできます。
module.exports = function(MyModel) {
MyModel.on('dataSourceAttached', function(obj){
var find = MyModel.find;
MyModel.find = function(filter, cb) {
return find.apply(this, arguments);
};
});
};
参照(外部サイト):