对于任何应用程序,数据校验都是重要部分,因为它有且于确保模型中的数据遵守了应用程序的业务规则。 例如,你可能想要确保密码最少要有8位,或者确保用户名唯一。 定义校验规则使表单处理非常非常简单。
校验过程有许多不同的面。本节覆盖的是其中模型这一面。 即:在调用模型中的 save() 方法时发生了什么。 关于如何处理校验错误的显示的更多信息,参见: 表单助手。
数据校验的第一步是在模型中建立校验规则。这是用模型定义中的 Model::validate 数组实现的:
在上面的示例中,$validate 数组被添加到 User 模型中,但数组不包含校验规则。 假设 users 表有 login、password、email 和 born 列,下面的示例展示了应用在这些列上的一些简单的校验规则:
上例展示了如何向模型列添加校验规则。对于 login 列,只接受字母和数字,email 必须是有效的邮件地址,born 必须是有效的日期。 如果提交的数据违反了定义的规则,这些校验规则定义能使 CakePHP 自动在表单中显示错误信息。
CakePHP 有许多校验规则,且易于使用。 一些内置的规则允许你校验 email、URL 和 信用卡数字的格式 - 我们稍后会讲到它们的细节。
下面是一个非常复杂的校验的示例,利用了一些内置的校验规则:
其中两条是为 login 定义的:它只能包含字母和数字,并且长度必须在5至15之间。 password 列必须不少于8位长。 email 必须是有效的邮件地址,并且 born 必须是有效的日期。 还要注意的是,怎样定义校验失败时显示特定的错误信息。
上面的例子中,单个列可以使用多个校验规则。如果内置的规则不能满足你的要求,你可以添加自己需要的校验规则。
现在你已经看到了数据校验的全景,让我们瞧瞧如何在模型中定义这些规则。有三种不同的方法:简单数组、每个列的单个规则、每个列的多个规则。
顾名思义,这是定义校验规则最简单的方法。 这种方法定义规则是标准语法是:
‘fieldName’ 是规则所适用的列的名字,‘ruleName’是预定义的规则名,例如 ‘alphaNumeric’、’email’ 或者 ‘isUnique’。
例如,要确保用户所提供的是格式正确的邮件地址,可以使用如下规则:
每个列一个规则
这种定义手法对校验规则的工作有更好的控制。在我们讨论这个之前,先来看看向单个列添加一条规则的标准用法:
‘rule’ 键是必须的。如果仅设置了 ‘required’ => true,表单验证将无法正确工作。因为 ‘required’ 不是实际的规则。
正如你看到的,每个列(上面只演示了一个列)与包含了如下五个键的数组关联:‘rule’、 ‘required’、 ‘allowEmpty’、 ‘on’ 和 ‘message’。让我们仔细地观察这几个键。
‘rule’ 方法定义了校验方面并且指定了一个值或者一个数组。这个特定的 ‘rule’ 可能是模型中的一个方法的名字,核心 Validation 类的一个方法的名字,或者正则表达式。要了解关于默认规则的更多信息,请参见 内核核验规则。
如果 rule 不包含任何参数,’rule’ 可以是单个值,例如:
如果 rule 包含参数(例如 max,min 或者范围),’rule’ 将是一个数组:
记住,用数组方式定义规则时,’rule’ 键是必须的。
这个键接受一个逻辑值、create 或者 update。将其设置为 true 将使这一列总是被必须的。设置为 create 或者update 将使这一列只在更新或创建操作时必须。如果 ‘required’ 等于 true,数组中必须提供此列。例如,如果定义如下校验规则:
传递给模型的 save() 方法的数据必须包含提供给 login 列的数据。如果它不存在,那么校验失败。这个键的默认值为逻辑 false。
required => true 与 校验规则中的 notEmpty() 不是一回事儿。required => true 表示这个数组 键 必须提供 - 不意味着它必须有值。如果数据集没有提供,校验失败,但是如果提交了空值(’‘)是有可能成功的(这依赖于规则的详细定义)。
在 2.1 版更改: 添加了对 create 和 update 的支持。
如果设置为 false,这个列的值必须是 非空的,, the field value must be nonempty, 其中 “nonempty” 非空的定义为 !empty($value) || is_numeric($value)。 对于数值检测,当 $value 为0时,CakePHP 认为是正确的。
required 与 allowEmpty 的不同可能会造成混乱。'required' => true 意味着 $this->data 中不提供带有这个列的键 就不能保存模型; 而 'allowEmpty' => false 则像上面描述的寻,是确保这个列的 值 必须是非空的。
‘on’ 键可以被设置为 ‘update’ 或 ‘create’。它提供了允许一些规则应用于创建新记录的过程中或者更新记录的过程中的机制。
如果一条规则被定义成 ‘on’ => ‘create’,这条规则仅在创建新记录的过程中有效。类似的,如果它被定义成 ‘on’ => ‘update’,将只在更新记录的过程中有效。
‘on’ 的默认值为空(null)。当 ‘on’ 为空(null),这条规则在创建和更新过程中同时生效。
message 键为规则自定义校验错误时的显示信息:
每个列多条规则
上面的技术为我们提供了比简单的规则分配更大的灵活性,再进一步,我们能获得更详细的数据校验控制。下面我们介绍一种允许我们为每个列赋予多个规则的技术。
想要为单个列赋多个校验规则,基本的写法如下:
正像你看到的那样,这和上一节中所做的非常相似。在那儿,每个列仅有一个校验参数数组。在这儿,每个 ‘fieldName’ 是一个规则数组的索引。每个 ‘ruleName’ 包含一个校验参数数组。
上一篇 Cakephp 的命名规则
下一篇 CakePHP 约定