自定义词形变化

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');
});

如果您需要更多信息,请查看 关于自定义词形变化的文档

您也可以使用完全不同的库,或者通过将 pluralizesingularize 方法作为 inflector 配置选项传递到 Mirage 服务器,来使用您自己的词形变化器实现。

createServer({
  inflector: {
    pluralize,
    singularize,
  },
})