yii2.0入门心得

yii2.0中的model的理解

学了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();防注入

这是基本的查找方法

ActiveRecord的基本使用

当我们activerecord的model写好了我们要就要使用它撒,话不多说上代码
$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的区别就是它不是操作数据库的,所以它不用写表名,而且还需要申明变量,
'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;
            }
        }
    }

}
大致就是这样,
博主的处女博,希望大家喜欢,并且一起学习,交流,大家一起提高嘛!欢迎私信......

你可能感兴趣的:(yii)