自定义词形变化
Mirage 在一些约定中依赖词形变化器。词形变化器是一个负责将单词单数化和复数化的对象。
例如,假设您定义了一个 User
模型以及一个 GET 简写
createServer({
models: {
user: Model,
},
routes() {
this.get("/users/:id")
},
})
Mirage 使用它的词形变化器来知道“users” 是“user” 的复数形式。因此,它可以自动获取您的 user
模型定义并创建 schema.users.all()
集合,并查看您的 /users/:id
简写,并知道它需要返回一个单独的 user
模型实例。
具有一致的命名约定使 Mirage 能够大幅减少连接模拟服务器所需的样板代码,但有时您会发现自己需要自定义在域中使用的词形变化规则。
例如,假设您的应用程序中有一个 HeadOfState
模型,并且在您系统中的其他任何地方,您将“head-of-state” 的复数形式视为“heads-of-state”。
如果您只是像这样设置您的服务器
createServer({
models: {
headOfState: Model,
},
routes() {
this.get("/heads-of-state/:id")
},
})
那么 Mirage 将无法按预期工作。这是因为 Mirage 的词形变化器不知道这种特殊情况。默认情况下,它将“head-of-state” 的复数形式变为“head-of-states”。
您可以通过调用 server.inflector.pluralize
方法来查看这一点
let server = createServer({
models: {
headOfState: Model,
},
})
server.inflector.pluralize("head-of-state") // head-of-states
要解决此问题,您需要添加自己的自定义词形变化规则。Mirage 使用 inflected
包 进行词形变化,您可以像这样自定义它
import { inflections } from "inflected"
import { createServer, Model } from "miragejs"
inflections("en", function (inflect) {
inflect.irregular("head-of-state", "heads-of-state")
})
createServer({
headOfState: Model,
routes() {
this.get("/heads-of-state/:id")
},
})
确保在 new
创建 Mirage 服务器之前运行词形变化自定义代码。
验证您的复数化规则是否生效
server.inflector.pluralize("head-of-state") // heads-of-state
现在,Mirage 的所有简写和 ORM 约定都应该按预期工作。
Inflected 包允许您自定义复数、单数、不规则和不可数单词
inflections('en', function(inflect) {
inflect.plural(/^(ox)$/i, '$1$2en');
inflect.singular /^(ox)en/i, '$1');
inflect.irregular('octopus', 'octopi');
inflect.uncountable('equipment', 'snow');
});
如果您需要更多信息,请查看 关于自定义词形变化的文档。
您也可以使用完全不同的库,或者通过将 pluralize
和 singularize
方法作为 inflector
配置选项传递到 Mirage 服务器,来使用您自己的词形变化器实现。
createServer({
inflector: {
pluralize,
singularize,
},
})