请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 5073|回复: 0

[数据操作] 创建自己的数据验证规则

[复制链接]
发表于 2012-8-4 16:49:10 | 显示全部楼层 |阅读模式

前面我们已经介绍了spVerifier的规则验证及信息提示方法,接下来我们继续开发spVerifier的能力,在验证中加入自己创建的验证规则。

首先我们看一下例子

  1. class user extends spModel
  2. {
  3.         public $pk = 'uid';
  4.         public $table = 'user';

  5.         // 我们定义自己的验证规则
  6.         var $addrules = array(
  7.                 // 自定义验证规则的函数名可以有两种形式
  8.                 // 第一种是 '规则名称' => '验证函数名',这是当函数是一个单纯的函数时使用
  9.                 // 第二种是‘规则名称’=> array('类名', '方法函数名'),这是当函数是一个类的某个方法函数时候使用。
  10.                 'youare' => 'checkname', //  '规则名称' => '验证函数名'
  11.                 'is_phone' => array('user', 'check_phone'), //‘规则名称’=> array('类名', '方法函数名')
  12.                 // 当然我们还可以定义更多的自定义规则
  13.         );

  14.         var $verifier = array(
  15.                 "rules" => array( // 规则
  16.                         'username' => array(
  17.                                 'notnull' => TRUE,
  18.                                 'minlength' => 5,
  19.                                 'maxlength' => 12,
  20.                                 'youare' => 'jake' // 加入了新的验证规则和验证值
  21.                         ),
  22.                         'phone' => array( // 这里要验证手机号
  23.                                 'notnull' => TRUE,
  24.                                 'is_phone' => TRUE, // 自定义的手机号验证规则
  25.                         ),
  26.                 ),
  27.                 "messages" => array( // 提示信息
  28.                         'username' => array(
  29.                                 'notnull' => "姓名不能为空",
  30.                                 'minlength' => "姓名不能少于5个字符",
  31.                                 'maxlength' => "姓名不能大于20个字符",
  32.                                 'youare' => "看来你不是jake", // 这里是规则不通过时的提示
  33.                         ),
  34.                         'phone' => array(
  35.                                 'notnull' => "手机号不能为空",
  36.                                 'is_phone' => "请填写正确的手机号",
  37.                         ),
  38.                 )
  39.         );


  40.         // 这里是user类的check_phone方法函数
  41.         // 请注意,自定义验证规则的函数,参数务必是($val, $right)
  42.         function check_phone($val, $right){
  43.                 if( is_numeric($val) && strlen($val) == 11 ){
  44.                         return TRUE; // $right是等于TRUE的
  45.                 }else{
  46.                         return FALSE; // 也就是 !$right
  47.                 }
  48.         }
  49. }

  50. // 这里是独立的函数checkname
  51. // 它的参数同样也必须是($val, $right)
  52. function checkname($val, $right){
  53.         if( $val == $right ){ // 当$val(输入值)等于$right(正确值)的时候,返回TRUE;
  54.                 return TRUE; // 返回TRUE则通过验证
  55.         }else{
  56.                 return FALSE; // 返回FALSE则无法通过验证
  57.         }
  58. }               
复制代码

下面我们来详细说明一下创建自定义验证规则的过程:

一、首先我们需要在user类(spModel继承类)中,设置$addrules,这样就能定义我们的自建规则的处理函数了。$addrules是一个数组,数组项的键是规则名称,值就是一个规则处理函数的定义。定义的函数可以有两种形式:

第一种是 '规则名称' => '验证函数名',这是当函数是一个单纯的函数时使用

第二种是‘规则名称’=> array('类名', '方法函数名'),这是当函数是一个类的某个方法函数时候使用。

  1. var $addrules = array(
  2.                 'youare' => 'checkname', //  '规则名称' => '验证函数名'
  3.                 'is_phone' => array('user', 'check_phone'), //‘规则名称’=> array('类名', '方法函数名')
  4.         );               
复制代码

这里就已经定义了youare和is_phone两个规则,youare的处理函数是独立函数checkname(),而is_phone的处理函数是user类的check_phone方法。

二、写作处理函数的代码。我们先看看checkname()的代码:

  1. // 这里是独立的函数checkname
  2. // 它的参数同样也必须是($val, $right)
  3. function checkname($val, $right){
  4.         if( $val == $right ){ // 当$val(输入值)等于$right(正确值)的时候,返回TRUE;
  5.                 return TRUE; // 返回TRUE则通过验证
  6.         }else{
  7.                 return FALSE; // 返回FALSE则无法通过验证
  8.         }
  9. }               
复制代码

正如注释内说明的一样,处理函数的参数必须是($val, $right),它们分别代码了输入的字符($val),正确的字符($right)。

请注意,spVerifier同时还提供了第三个参数$values。以下两种写法都是正确的:

function checkname($val, $right){

或者

function checkname($val, $right, $values){

$values是一个数组,主要的作用是保存了其他的输入字符,当自建的验证函数需要到其他的输入字符时,就可以直接使用$values。比如说在验证用户籍贯时,用户同时输入了省份和城市,那么在验证城市的时候,也是需要获取省份进行共同验证的。

spVerifier规定了规则处理函数必须返回TRUE或者FALSE,返回TRUE是通过了验证,返回FALSE是无法通过验证。

如果函数返回的并非TRUE/FALSE,那程序有可能判断成非FALSE,即是TRUE的,所以请严格的控制规则处理函数仅返回TRUE/FALSE。

规则处理函数同时也可以是类的方法函数:

  1. class user extends spModel
  2. {
  3.         // 这里是user类的check_phone方法函数
  4.         // 请注意,自定义验证规则的函数,参数务必是($val, $right)
  5.         function check_phone($val, $right){
  6.                 if( is_numeric($val) && strlen($val) == 11 ){
  7.                         return TRUE; // $right是等于TRUE的
  8.                 }else{
  9.                         return FALSE; // 也就是 !$right
  10.                 }
  11.         }
  12. }       
复制代码

与user::is_phone的调用形式不同,规则处理函数在调用类方法的时候,是使用spClass(user)->is_phone(...)形式的,这样调用有利于对象的初始化。

上面介绍了如何创建自己的验证规则,那么现在我们可以自己动手试试,比如建立一个验证用户名是否重复的规则,或建立一个过滤留言中不良词语的规则吧。



您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2020-2-19 21:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表