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 一個宣告式 DSL,用於定義驗證規則、架構產生和 CRUD 產生元資料。例如,考慮這些約束
請參閱使用者指南主題 約束 以取得更多資訊。
全域約束
您可以在 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
中。
如果您想進一步控制要匯入的約束,請使用 include
和 exclude
命名參數。這兩個參數都接受一個簡單或正規表示式字串清單,這些字串會與來源約束中的屬性名稱進行比對。例如,如果您只想匯入「lastName」約束,您會使用
...
static constraints = {
importFrom User, include: ["lastName"]
...
}
或者如果您想要匯入所有以「Name」結尾的約束
...
static constraints = {
importFrom User, include: [/.*Name/]
...
}
當然,exclude
會執行相反的動作,指定不應匯入哪些約束。
快速參考
約束 | 說明 | 範例 |
---|---|---|
blank |
驗證字串值是否不為空白 |
|
creditCard |
驗證字串值是否為有效的信用卡號碼 |
|
驗證字串值是否為有效的電子郵件地址。 |
|
|
inList |
驗證值是否在受約束值的範圍或集合內。 |
|
matches |
驗證字串值是否符合給定的正規表示式。 |
|
max |
驗證值是否不超過給定的最大值。 |
|
maxSize |
驗證值的大小是否不超過給定的最大值。 |
|
min |
驗證值是否不低於給定的最小值。 |
|
minSize |
驗證值的大小是否不低於給定的最小值。 |
|
notEqual |
驗證屬性是否不等於指定的值 |
|
nullable |
允許屬性設定為 |
|
範圍 |
使用 Groovy 範圍來確保屬性的值出現在指定的範圍內 |
|
比例 |
設定為浮點數的所需比例(即小數點右邊的位數)。 |
|
大小 |
使用 Groovy 範圍來限制集合或數字的大小或字串的長度。 |
|
唯一 |
在資料庫層面將屬性約束為唯一 |
|
網址 |
驗證字串值是否為有效的網址。 |
|
驗證器 |
新增自訂驗證至欄位。 |
請參閱文件 |
鷹架
有些約束不會影響持久性,但會自訂鷹架。通常不建議在網域中包含 UI 資訊,但如果您廣泛使用 Grails 的鷹架,這會帶來極大的便利性。
約束 | 說明 |
---|---|
顯示 |
布林值,用於判斷是否在鷹架檢視中顯示屬性。如果為 |
可編輯 |
布林值,用於判斷是否可以從鷹架檢視中編輯屬性。如果為 |
格式 |
為接受格式的類型(例如日期)指定顯示格式。例如,'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
。