(快速參考)

約束使用

約束提供 Grails 一個宣告式 DSL,用於定義驗證規則、架構產生和 CRUD 產生元資料。例如,考慮這些約束

class User {
    ...

    static constraints = {
        login size: 5..15, blank: false, unique: true
        password size: 5..15, blank: false
        email email: true, blank: false
        age min: 18
    }
}

請參閱使用者指南主題 約束 以取得更多資訊。

全域約束

您可以在 grails-app/conf/runtime.groovy 內部套用全域約束,如下所示

grails.gorm.default.constraints = {
    '*'(nullable: true, size: 1..20)
}

萬用字元表示約束套用於所有屬性。您也可以定義共用約束

grails.gorm.default.constraints = {
    myShared(nullable: true, size: 1..20)
}

可以在您的類別中重複使用

class User {
    ...

    static constraints = {
        login(shared: "myShared")
    }
}

共用約束

全域約束是共用不同類別之間約束的一種方式,例如在網域類別和命令物件之間。這不再是唯一的方式。Grails 2 導入 constraints 區塊的新語法,讓您可以直接從另一個類別重複使用約束。

假設您有一個網域類別,如下所示

class User {
    String firstName
    String lastName
    String passwordHash

    static constraints = {
        firstName blank: false, nullable: false
        lastName blank: false, nullable: false
        passwordHash blank: false, nullable: false
    }
}

然後您想要建立一個命令物件 UserCommand,共用網域類別的一些屬性和對應的約束。您可以使用 importFrom() 方法執行此動作

class UserCommand {
    String firstName
    String lastName
    String password
    String confirmPassword

    static constraints = {
        importFrom User

        password blank: false, nullable: false
        confirmPassword blank: false, nullable: false
    }
}

這將匯入 User 領域類別中的所有約束,並將其套用於 UserCommand。匯入會略過來源類別 (User) 中沒有對應屬性的任何約束 (UserCommand)。在上述情況中,只有「firstName」和「lastName」約束會匯入到 UserCommand 中。

如果您想進一步控制要匯入的約束,請使用 includeexclude 命名參數。這兩個參數都接受一個簡單或正規表示式字串清單,這些字串會與來源約束中的屬性名稱進行比對。例如,如果您只想匯入「lastName」約束,您會使用

...
static constraints = {
    importFrom User, include: ["lastName"]
    ...
}

或者如果您想要匯入所有以「Name」結尾的約束

...
static constraints = {
    importFrom User, include: [/.*Name/]
    ...
}

當然,exclude 會執行相反的動作,指定不應匯入哪些約束。

快速參考

約束 說明 範例

blank

驗證字串值是否不為空白

login(blank:false)

creditCard

驗證字串值是否為有效的信用卡號碼

cardNumber(creditCard: true)

email

驗證字串值是否為有效的電子郵件地址。

homeEmail(email: true)

inList

驗證值是否在受約束值的範圍或集合內。

name(inList: ["Joe", "Fred", "Bob"])

matches

驗證字串值是否符合給定的正規表示式。

login(matches: "[a-zA-Z]+")

max

驗證值是否不超過給定的最大值。

age(max: new Date()) price(max: 999F)

maxSize

驗證值的大小是否不超過給定的最大值。

children(maxSize: 25)

min

驗證值是否不低於給定的最小值。

age(min: new Date()) price(min: 0F)

minSize

驗證值的大小是否不低於給定的最小值。

children(minSize: 25)

notEqual

驗證屬性是否不等於指定的值

login(notEqual: "Bob")

nullable

允許屬性設定為 null - 預設為 false

age(nullable: true)

範圍

使用 Groovy 範圍來確保屬性的值出現在指定的範圍內

age(range: 18..65)

比例

設定為浮點數的所需比例(即小數點右邊的位數)。

salary(scale: 2)

大小

使用 Groovy 範圍來限制集合或數字的大小或字串的長度。

children(size: 5..15)

唯一

在資料庫層面將屬性約束為唯一

login(unique: true)

網址

驗證字串值是否為有效的網址。

homePage(url: true)

驗證器

新增自訂驗證至欄位。

請參閱文件

鷹架

有些約束不會影響持久性,但會自訂鷹架。通常不建議在網域中包含 UI 資訊,但如果您廣泛使用 Grails 的鷹架,這會帶來極大的便利性。

約束 說明

顯示

布林值,用於判斷是否在鷹架檢視中顯示屬性。如果為 true(預設值),則會顯示屬性。

可編輯

布林值,用於判斷是否可以從鷹架檢視中編輯屬性。如果為 false,則關聯的表單欄位會以唯讀模式顯示。

格式

為接受格式的類型(例如日期)指定顯示格式。例如,'yyyy-MM-dd'。

密碼

布林值,表示是否應使用密碼欄位顯示此屬性。僅適用於通常會以文字欄位顯示的欄位。

小工具

控制用於顯示屬性的 p 小工具。例如,'textarea' 會強制鷹架使用 <textArea> 標籤。

程式存取

您可以透過存取網域類別的 constrainedProperties 靜態屬性,在其他內容中以程式方式存取網域的約束。該屬性是 Map<String, ConstrainedProperty> 的執行個體。

class User {
    String firstName
    String middleName

    static constraints = {
        firstName blank: false, nullable: false
        middleName blank: true, nullable: true
    }
}

在上面的範例中,存取 User.constrainedProperties.firstName.blank 會產生 false,而 User.constrainedProperties.middleName.blank 會產生 true

指令物件

存取指令物件上的約束略有不同。您可以在另一個內容中以程式方式存取指令物件的約束,方法是存取實作 Validateable 的類別的 constraintsMap 靜態屬性。該屬性是 Map<String, ConstrainedProperty> 的執行個體

class User implements Validateable {
    String firstName
    String middleName

    static constraints = {
        firstName blank: false, nullable: false
        middleName blank: true, nullable: true
    }
}

在上面的範例中,存取 User.constraintsMap.firstName.blank 會產生 false,而 User.constraintsMap.middleName.blank 會產生 true