自訂詞形變化

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,
  },
})