yii2.0入门心得

来源:互联网 发布:python base64解码算法 编辑:程序博客网 时间:2024/06/05 14:45

yii2.0中的model的理解

学了php后发现直接用php写网站实在是繁琐,关键是全部都是代码重复的判断,所以博主尝试去使用框架开发,在慢慢深入学习yii框架之后,实在是感叹框架的灵活,yii框架的强大我就不拍马屁了,今天主要讲讲我对yii框架mvc中的model的理解吧,博主也是刚刚学,所以思路仅供参考,要是有什么不对的地方欢迎指点再见........

先讲讲model的用处是什么,model大概的理解是一组数据的集合,比如一个数据库的表里面的字段你也可以理解成是一组数据,一个提交的表单它也是一组数据,你可以为这些数据建立一个model类,然后在model里面对这些数据进行统一的操作,比如对用户提交的一个表单自然需要对数据进行安全验证,这是直接在model里面的rules方法里声明就好了,代码简介优雅了不止一点点啊.....羡慕

yii2框架的模型有两个类,我们写models的时候要继承这两个中的一个,ActiveRecord和Model,我们先来讲讲ActiveRecord这个基类吧

<?phpnamespace common\models;use yii\db\ActiveRecord;class User extends 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();防注入

这是基本的查找方法

ActiveRecord的基本使用

当我们activerecord的model写好了我们要就要使用它撒,话不多说上代码
<?phpnamespace backend\controllers;use yii;use common\models\User;use yii\data\Pagination;class UserController extends AdminController{    public $layout='empty';    public function actionIndex(){        $model = User::find();        $pagination = new Pagination(['totalCount'=>$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表的一段代码,讲讲就很简单了
首先要new一个对象出来,
 $model->load(yii::$app->request->post())
然后把用户提交的表单数据给放到这个对象里面

$model->validate()
这个代码就是验证用户提交的数据是否合理的拉当用户提交的post满足rules规则时,它就会返回true

然后直接save()它就被保存到数据库里面了,就是简单骚气

模型的另一个基类Model

仔细想想真的没啥好讲的了,因为 activerecord就是继承model的,它与activeRecord的区别就是它不是操作数据库的,所以它不用写表名,而且还需要申明变量,
<?phpnamespace backend\models;use yii\base\Model;use yii\web\Cookie;use common\models\User;use Yii;class LoginForm extends Model{    //变量    public $username;    public $password;    public $verifyCode;    public $remember;    //规则    public function rules(){        return [            ['verifyCode','captcha','captchaAction'=>'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;            }        }    }}
大致就是这样,
博主的处女博,希望大家喜欢,并且一起学习,交流,大家一起提高嘛!欢迎私信......
1 0