Skip to content

エラーメッセージ

govalid のエラーシステムは、すぐ使えて、上書きが些細であるよう 設計されています。失敗したルールごとに *ErrContext が生成され、 その Error() は 3 つのピースから組み立てられた可読な文字列を 返します:

  1. フィールドの ラベル(例:"邮箱"
  2. ルールの テンプレート(例:"不能为空"
  3. ルールの 制限値(あれば。例:max:100 に対する 100

例:ラベル "评分" 上の min:0"评分应大于0" を生成します。

フィールド単位の上書き:msg

メッセージを変える最も単純な手段は構造体フィールド上の msg タグ です。最初に失敗したルールがそのテキストにショートサーキットします:

go
type Form struct {
    Password string `valid:"required;minlen:8;maxlen:64" label:"密码" msg:"密码长度需在 8-64 之间"`
}

プロダクトコピーが原因の細かさより重要な時に msg を使ってください。

ルールテンプレートの差し替え

SetMessageTemplates はあなたの上書きをロケールのテンプレート セットへマージします。デフォルトロケールは中国語です;別のロケール を更新したい場合は language.Tag を渡します:

go
govalid.SetMessageTemplates(map[string]string{
    "required": "can not be null",
    "min":      "must be greater than",
})

govalid.SetMessageTemplates(map[string]string{
    "required": "must not be empty",
}, language.English)

テンプレートの構造

テンプレートはプレースホルダーを含むことも、 {{ … }} で包むこともできます:

パターン効果
プレーン文字列("不能为空"フィールドラベルが前置、制限値が非 nil なら末尾に追加
{field} / {limit} を含むプレースホルダーがそのまま置換される
{{ … }} で包まれているラベルの前置と制限値の末尾追加を完全にスキップ
go
govalid.SetMessageTemplates(map[string]string{
    "min": "{{字段 {field} 必须 ≥ {limit}}}",
})

// → "字段 Score 必须 ≥ 10"  (ラベル前置なし、制限値末尾なし)

プレースホルダー定数 FieldNamePlaceholder = "{field}"FieldLimitPlaceholder = "{limit}" は公開されているので、設定から テンプレートを組み立てる場合に参照できます。

診断テンプレート

govalid は診断用に 3 つの内部テンプレートを使います。すべて _ で 始まります:

キー使われる時
_checkerNotFoundタグが未登録のチェッカーを参照
_unknownErrorTemplateカスタムチェッカーが未マップのキーに到達
_paramErrorタグのパラメータが欠落・不正
_valueTypeError実行時種別がチェッカーで未サポート
_fieldNotFoundクロスフィールドルールが存在しないフィールドを参照

通常のルールと同じく上書きできます:

go
govalid.SetMessageTemplates(map[string]string{
    "_checkerNotFound": "未知的校验规则",
})

プログラムからのアクセス

返ってきた errs スライスの各エントリは *ErrContext で、公開 フィールドを内省できます:

go
errs, ok := govalid.Check(form)
if !ok {
    for _, e := range errs {
        log.Printf("[%s] label=%q value=%v -> %s",
            e.FieldName, e.FieldLabel, e.FieldValue, e)
    }
}

後からエラーを書き換える

*ErrContext はメッセージを後から微調整するための 2 つのミューテー ターを公開しています——典型的にはカスタムチェッカー内で使います:

go
ctx := govalid.NewErrorContext(c)
ctx.SetTemplate("alphadash") // 別のテンプレートに完全に切り替え
ctx.SetFieldLimitValue(42)   // 新しい制限値で再描画

SetTemplate は以前に保存された制限値をクリアするので、 "name can not be empty<old limit>" のようなメッセージがテンプレート 間で漏れることはありません。

MIT ライセンスのもとで公開されています。