学了php后发现直接用php写网站实在是繁琐,关键是全部都是代码重复的判断,所以博主尝试去使用框架开发,在慢慢深入学习yii框架之后,实在是感叹框架的灵活,yii框架的强大我就不拍马屁了,今天主要讲讲我对yii框架mvc中的model的理解吧,博主也是刚刚学,所以思路仅供参考,要是有什么不对的地方欢迎指点........
先讲讲model的用处是什么,model大概的理解是一组数据的集合,比如一个数据库的表里面的字段你也可以理解成是一组数据,一个提交的表单它也是一组数据,你可以为这些数据建立一个model类,然后在model里面对这些数据进行统一的操作,比如对用户提交的一个表单自然需要对数据进行安全验证,这是直接在model里面的rules方法里声明就好了,代码简介优雅了不止一点点啊.....
yii2框架的模型有两个类,我们写models的时候要继承这两个中的一个,ActiveRecord和Model,我们先来讲讲ActiveRecord这个基类吧
public static function tableName(){
return '{{%user}}';
}
//验证规则
public function rules(){
return [
['username','checkName','skipOnEmpty'=>false],
['password','string','min'=>6,'tooShort'=>'密码的长度不能小于6位','skipOnEmpty'=>false,'when' => function($model){ return ($model->isNewRecord || $model->password != "");}],
['status','in','range'=>[0,1],'message'=>'非法操作'],
];
}
//自定义验证函数
public function checkName($attribute,$params){
if(!preg_match("/^[\w]{2,30}$/", $this->$attribute)){
$this->addError($attribute,'用户名必须是2~30的数字或字母');
}else if(self::find()->where(['username'=>$this->$attribute])->andwhere(['!=','id',$this->id])->count()>0){
$this->addError($attribute,'用户名已存在');
}
}
//在模型保存数据库时执行的函数
public function beforeSave($insert){
if(parent::beforeSave($insert)){
if($this->isNewRecord){
$this->date = $this->login_date = time();
}
$this->date = time();
if(empty($this->password)){
unset($this->password);
}else{
$this->password = md5($this->password);
}
return true;
}
return false;
}
//删除函数
public static function deleteIn($selected){
$data=new arrary();
foreach($selected as $va){
if($va==self::SUPER_ID){
continue;
}
$data[] = (int)$va;
}
return self::deleteAll(['id'=>$data]);
}
}
这是我刚刚写的一个项目的一个继承ActiveRecord 的model
use yii\db\ActiveRecord;
,我们先要use 一下基类,这就是yii框架的封装好的,
class User extends ActiveRecord
我们写的类就要继承他们,注意类名最好与表名相同
public static function tableName(){
return '{{%user}}';
}
既然是ActiveRecord是对数据库表的数据的操作,所以第一件事是什么?!当然是声明表名!
public function rules(){
return [
['username','checkName','skipOnEmpty'=>false],
['password','string','min'=>6,'tooShort'=>'密码的长度不能小于6位','skipOnEmpty'=>false,'when' => function($model){ return ($model->isNewRecord || $model->password != "");}],
['status','in','range'=>[0,1],'message'=>'非法操作'],
];
}
这个就是规则函数,我们要返回一个数组,数组里面写满了对数据库的数据的约束,比如password字段你一定要是长为6的字符串等等.....不过具体怎么写验证你们还是去看文档吧
这个类不需要事先写字段,这些变量就是数据库表里面的字段,yii框架会自动识别(手动强大......)
['username','checkName','skipOnEmpty'=>false],
//自定义验证函数
public function checkName($attribute,$params){
if(!preg_match("/^[\w]{2,30}$/", $this->$attribute)){
$this->addError($attribute,'用户名必须是2~30的数字或字母');
}else if(self::find()->where(['username'=>$this->$attribute])->andwhere(['!=','id',$this->id])->count()>0){
$this->addError($attribute,'用户名已存在');
}
}
我们还可以自定义验证函数,具体代码就如下,当验证username的时候它就会自动执行checkName函数,当发现字段非法的时候只需要
$this->addError($attribute,'用户名必须是2~30的数字或字母');
这样子就可以了,
这个既然是与表连接模型,自然对这个数据库表的所有操作它也给你封装好了撒,其实这也是它和另一个基类的区别哦,另一个model就是少了与数据库的操作(个人理解)
下面我给你列举几个函数吧,具体就参考文档吧,是在写不完我们主要是入门
删除数据
User::findOne(1)->delete();
User::deleteAll('id'=>2);
保存数据
User::save();
public function beforeSave($insert){
if(parent::beforeSave($insert)){
if($this->isNewRecord){
$this->date = $this->login_date = time();
}
$this->date = time();
if(empty($this->password)){
unset($this->password);
}else{
$this->password = md5($this->password);
}
return true;
}
return false;
}
在保存数据之前执行的函数,比如你在保存数据的数据你现在做一些事情,你只要声明这个函数,它就会在save函数调用的时候自动调用挺好的
//$model=User::find()->where('id=:id',[':id'=>2])->one();防注入
这是基本的查找方法
$model->count(),'pageSize'=>3]);
$result = $model->offset($pagination->offset)->limit($pagination->limit)->all();
return $this->render('index',['result'=>$result,'pagination'=>$pagination]);
}
public function actionAdd(){
$model = new User();
if(yii::$app->request->ispost && $model->load(yii::$app->request->post()) && $model->validate()){
if( $model->save()){
yii::$app->session->setFlash('success','添加用户成功');
}else{
yii::$app->session->setFlash('error','添加用户失败');
}
return $this->redirect(['index']);
}
return $this->render('add',['model'=>$model]);
}
public function actionEdit(){
$id = yii::$app->request->get('id',0);
$model = User::findOne($id);
if(!$model){
return $this->redirect(['index']);
}
if(yii::$app->request->ispost && $model->load(yii::$app->request->post()) &&$model->validate()){
if( $model->save()){
yii::$app->session->setFlash('success','编辑用户成功');
}else{
yii::$app->session->setFlash('error','编辑用户失败');
}
return $this->redirect(['index']);
}
$model->password = "";
return $this->render('edit',['model'=>$model]);
}
public function actionDelete(){
$selected = yii::$app->request->post('selected',[]);
if(User::deleteIn($selected)){
yii::$app->session->setFlash('success','删除用户成功');
}else{
yii::$app->session->setFlash('error','删除用户失败');
}
return $this->redirect(['index']);
}
}
use common\models\User;
同样的事情我们先要引用这个类
public function actionAdd(){
$model = new User();
if(yii::$app->request->ispost && $model->load(yii::$app->request->post()) && $model->validate()){
if( $model->save()){
yii::$app->session->setFlash('success','添加用户成功');
}else{
yii::$app->session->setFlash('error','添加用户失败');
}
return $this->redirect(['index']);
}
return $this->render('add',['model'=>$model]);
}
这是增加user表的一段代码,讲讲就很简单了
$model->load(yii::$app->request->post())
然后把用户提交的表单数据给放到这个对象里面
$model->validate()
这个代码就是验证用户提交的数据是否合理的拉当用户提交的post满足rules规则时,它就会返回true
然后直接save()它就被保存到数据库里面了,就是简单骚气
'login/captcha','message'=>'验证码错误'],
[['password','remember'],'safe'],
['username' ,'validateAccount','skipOnEmpty'=>false],
];
}
//自定义验证函数
public function validateAccount($attribute,$params){
if(!preg_match('/^\w{2,30}$/',$this->$attribute)){
$this->addError($attribute,'账号或密码错误');
}else if(strlen($this->password)<6){
$this->addError($attribute,'账号或密码错误');
}else{
$user = User::find()->where(['username'=>$this->$attribute,'status'=>1])->asArray()->one();
if(!$user || md5($this->password)!=$user['password']){
$this->addError($attribute,'账号或密码错误');
}else{
$this->user=$user;
}
}
}
}
大致就是这样,