自动完成

ThinkPHP 模型层提供的数据处理方法,主要用于数据的自
动处理和过滤,使用 create()方法创建数据是会自动完成。

一. 完成规则

自动完成一般通过默认字段写入、安全字段过滤以及业务逻辑的自动处理等。有两种方
式实现自动完成的规则:1.静态方式:在模型类里通过$_auto 属性定义处理规则;2 动态
方式:使用模型类的 auto 方法动态创建自动处理规则。

1 //完成规则
2 array(
3 array(完成字段1,完成规则,[完成条件,附加规则]),
4 array(完成字段2,完成规则,[完成条件,附加规则]),
5 ......
6 );

完成字段:必填,需要的字段名;
完成规则:必填,配合附加规则完成;
完成条件:可选,具体如下:
1.self::MODEL_INSERT 或 1,新增数据的时候处理(默认);
2.self::MODEL_UPDATE 或 2,更新数据的时候处理;
3.self::MODEL_BOTH 或 3,所有情况均处理。


附加规则:可选,配合完成规则使用,包括一下规则:

 规则  说明
 function  函数完成,定义的验证规则是一个函数名
 callback  方法完成,定义的验证规则是当前模型类的一个方法
 field  用其他字段填充,表示填充的内容是一个其他字段的值
 string   字符串(默认)
 ignore  为空则忽略(3.1.2新增)

二. 静态定义
在模型类里预先定义好该模型的自动完成规则,就是静态定义。

在  Home/controller/UserController.class.php 里插入以下代码:

1 public function add() {
2             $user=D('User');
3             $data['user']='蜡笔大新';
4             $data['email']='bbb@qq.com';
5             if($user->create($data)) {
6                 $user->add();
7             }
8         }

注意一下的是: $user->add(); 里不再需要加上$data了否则后面的功能就实现不了了。

然后在 Home/Model/UserModel.class.php 插入以下代码:

 1 <?php
 2 namespace HomeModel;
 3 use ThinkModel;
 4 
 5 class UserModel extends Model {
 6     protected $_auto = array(
 7         array('count','1'),
 8         array('user','sha1',3,'function'),
 9         );
10 }

这时当执行 Home/controller/UserController.class.php 的add()函数时,添加到数据库的数据中的count下的数值会自动加一,同时user会使用sha1加密,

 array('user','sha1',3,'function'), 中使用了function,当并没有在conmon文件夹下的common下建立function.php,并在其中建立function sha1函数,

是因为sha1加密函数是ThinkPHP自带的,已经封装好了,md5加密方式也是。

还有诸如:

1 array('user','email',3,'field'),

是把email写入到用户名中。

callback,给用户名加前缀

这时就是当添加用户名到数据库时,给上传的用户名加上前缀

 在 Home/controller/UserController.class.php 下插入:

1 public function add() {
2             $user=D('User');
3             $data['id']=12;
4             $data['user']='dedede';
5             $data['email']='dead@qq.com';
6             if($user->create($data)) {
7                 $user->add();
8             }
9         }

然后在 Home/Model/UserModel.class.php 中插入:

 1 <?php
 2 namespace HomeModel;
 3 use ThinkModel;
 4 
 5 class UserModel extends Model {
 6     protected $_auto = array(
 7         array('user','updateUser','3','callback','_'),//'_'即为updateUser($str,$prefix)中的$prefix
 8         );
 9 
10     protected function updateUser($str,$prefix) {
11         return $prefix.$str;
12     }
13 }

这时每次往数据库插入一条数据,都会在user下的用户名前加上'_'

1 //ignore,用于修改时密码留空时,忽略修改
2 array('password', '', 2, 'ignore'),

这是在 Home/controller/UserController.class.php 中当提交的时候用户名为空时,则忽略掉不改变数据库中的用户名,只改变密码就好了。

三. 动态完成
动态完成就是把完成的规则放在控制器端,这样,在操作的时候比较灵活,缺点就是比较混乱

 1 public function add() {
 2             $rules=array(
 3                 array('user','sha1',3,'function'),
 4                 );
 5             $user=M('User');
 6             $data['user']='蜡笔小新';
 7             if($user->auto($rules)->create($data)) {
 8                 $user->add();
 9             }
10         }

需要注意的是在得到添加的数据时,auto前面不要加$符号。

原文地址:https://www.cnblogs.com/jacson/p/4501175.html