zoukankan      html  css  js  c++  java
  • YII框架入门

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

    QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235

    一、安装

    php运行环境安装包:http://www.phpstudy.net/a.php/207.html

    Yii安装包:

    https://github.com/yiisoft/yii2/releases/download/2.0.6/yii-basic-app-2.0.6.tgz (Yii2的基本应用程序模板)

    https://github.com/yiisoft/yii2/releases/download/2.0.6/yii-advanced-app-2.0.6.tgz (Yii2的高级应用程序模板)

    下载 Yii2的基本应用程序模板 完毕后解压到网站根目录。

    我的网站根目录是:F: estyii

    域名是:www.testyii.com

    访问 http://www.testyii.com/requirements.php 检查安装环境。

    注意php版本必须是5.4以上。

    配置cookie验证密钥: 文件 F: estyiiconfigweb.php 里面有个 cookieValidationKey 项 随便给个abcd字符即可

    访问 http://www.testyii.com/web/index.php 看到 Congratulations! 表示安装完毕了。

    二、控制器

    控制器文件地址:F: estyiicontrollers

    创建格式:

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            echo 'hello word';
        }
    }
    复制代码

     访问格式:请求入口?r=控制器名/操作名

    例如:http://www.testyii.com/web/index.php?r=test/index

    注意访问这里的控制器名与操作名不区分大小写。

    控制器父类源代码是 F: estyiivendoryiisoftyii2webController.php

    控制可以使用父类的public方法和属性 例如使用跳转方法 redirect($url, $statusCode = 302)

    三、接收变量

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            $request = YII::$app->request; //通过全局类 YII 得到请求组件 $request
            $id = $request->get('id','default'); //通过请求组件的get方法得到GET传递过来的数据
            echo $id; //如果传递了 id 则输出id 没有传递 则输出 default
        }
    }
    复制代码

    请求组件的源代码是 F: estyiivendoryiisoftyii2webRequest.php

    里面有很多方法可供使用 例如接受POST变量的 post 方法

    三、SESSION 处理

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            $session = YII::$app->session; //得到session组件 $session
            $session->open(); //开启session
            $session['name'] = '张三'; //写入session
            $name = $session['name']; //读取session
            unset($session['name']); //删除session中的某个值
            $session->destroy(); //销毁session
            echo $name;
        }
    }
    复制代码

    上面的代码中,我通过YII全局类得到$session组件,这个组件是一个对象,但是紧接着我却把它当作数组进行操作。是因为session组件实现了php内置的ArrayAccess接口。

    session组件的源码是:F: estyiivendoryiisoftyii2webSession.php

    四、COOKIE 处理

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    use yiiwebCookie;
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            //得到响应组件里面的cookies对象
            $cookies = YII::$app->response->cookies; 
            //等待写入的cookie数据
            $cookie_1 = array('name'=>'age','value'=>18); 
            $cookie_2 = array('name'=>'gender','value'=>'male');
            //add方法接受一个Cookie类生成的对象
            $cookies->add(new Cookie($cookie_1)); //写入cookie
            $cookies->add(new Cookie($cookie_2)); 
            echo $cookies['age']; //读取cookie
            unset($cookies['age']); //删除cookie
        }
    }
    复制代码

    注意这里的代码又 use 了一个命名空间。

    Cookie类的源码是:F: estyiivendoryiisoftyii2webCookie.php

    从源码中可看到,等待写入cookie的数组,除了name value 外 还可以有 domain expire path secure httpOnly 等数据

    响应组件里面的cookies对象的生成类源码:F: estyiivendoryiisoftyii2webCookieCollection.php

    从源码中可以看到 它有个 getValue($name, $defaultValue = null) 方法也很实用。

    五、数据模型

     准备两张表:

    复制代码
    CREATE TABLE `user` (
      `uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
      `uname` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
      `upass` varchar(50) NOT NULL DEFAULT '' COMMENT '密码',
      PRIMARY KEY (`uid`)
    ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表';
    
    CREATE TABLE `log` (
      `log_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `uid` int(11) NOT NULL DEFAULT '0' COMMENT '操作者id',
      `content` varchar(8000) NOT NULL DEFAULT '' COMMENT '操作内容',
      `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
      PRIMARY KEY (`log_id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户操作日志表';
    复制代码

    配置Yii连接数据库的信息:F: estyiiconfigdb.php

    复制代码
    <?php
    
    return [
        'class' => 'yiidbConnection',
        'dsn' => 'mysql:host=localhost;dbname=test', //指定数据库
        'username' => 'root',
        'password' => 'root',
        'charset' => 'utf8',
    ];
    复制代码

    模型文件地址:F: estyiimodels

    创建模型:

    文件夹 F: estyiimodels 下有个 User.php 与我刚才创建的User表名字有冲突,我把它做个备份,然后创建一个新的 User.php

    模型的名字与类名字与表名字保持一致。

    复制代码
    <?php
    namespace appmodels; //模型必须放在 这个命名空间中
    
    use yiidbActiveRecord; //模型继承的类的命名空间
    
    class User extends ActiveRecord {
    
    }
    复制代码

    ActiveRecord 类的源码地址:F: estyiivendoryiisoftyii2db

    使用模型之插入数据:

    插入表单之前我先在模型中创建一个验证规则,更多关于验证器的信息 http://www.yiichina.com/doc/guide/2.0/tutorial-core-validators

    复制代码
    <?php
    namespace appmodels; //模型必须放在 这个命名空间中
    
    use yiidbActiveRecord; //模型继承的类的命名空间
    
    class User extends ActiveRecord {
        public function rules() {
            return [
                [['uname', 'upass'], 'trim'], //去掉空格
                [['uname', 'upass'], 'required'], //必须填写
                ['uname', 'string', 'min'=>5, 'max'=>20 ], //限制字符长度
                ['upass', 'string', 'min'=>6, 'max'=>50 ],
            ];
        }
    }
    复制代码

    再回到控制器中,使用user模型插入数据

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    use appmodelsUser;
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            $user = new User; //实例化模型对象
            $user->uname = 'zhangsan'; //待插入的数据
            $user->upass= '888888';
            //验证数据 成功返回 true 失败 返回 false
            if(!$user->validate()) die('error');
            $uid = $user->save(); //插入数据
            $uid = $user->attributes['uid']; //得到自增id
            echo $uid;
        }
    }
    复制代码

    使用模型之查找数据:

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    use appmodelsUser;
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            $user = new User; //实例化模型对象
            //1.执行一条查询语句
            $sql = "select * from user";
            $results = $user->findBySql($sql)->all(); //all方法返回一个二维数组  one方法返回一维数组
            $one_user = $results[0]->attributes(); //得到一条记录的所有数据
            $one_user_name = $results[0]->uname; //得到一条记录的某个值
            //print_r($one_user);
            //print_r($one_user_name);
            
            //2.查询一条记录
            $results = User::find()->where(['uid' => 1])->one()->toArray(); //这里直接返回了数组格式
            print_r($results);
        }
    }
    复制代码

    关于更多的查询信息 http://www.yiichina.com/doc/api/2.0/yii-db-activerecord

    使用模型之修改数据:

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    use appmodelsUser;
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            $user_obj = User::findOne(1); //得到主键uid为1的数据的对象
            $user_obj->upass = 111111; //修改密码        if ($user_obj->update() !== false) {
                echo 'update successful';
            } else {
                echo 'update failed';
            }
        }
    }
    复制代码

    使用模型之删除数据:

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    use appmodelsUser;
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            $user_obj = User::findOne(1); //得到主键uid为1的数据的对象
            if ($user_obj->delete() !== false) {
                echo 'delete successful';
            } else {
                echo 'delete failed';
            }
        }
    }
    复制代码

    使用模型之关联查询:

    下面演示用户表关联用户日志表的关联操作。

    给log表插入两条记录

    INSERT INTO `log` VALUES ('1', '2', '呵呵', '10');
    INSERT INTO `log` VALUES ('2', '2', '哈哈', '20');

    再创建一个日志模型 F: estyiimodelsLog.php。

    复制代码
    <?php
    namespace appmodels; //模型必须放在 这个命名空间中
    
    use yiidbActiveRecord; //模型继承的类的命名空间
    
    class Log extends ActiveRecord {
        
    }
    复制代码

    再回到控制器中

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    use appmodelsUser;
    use appmodelsLog;
    
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            //一对多关系的查询
            $user_obj = User::findOne(2);
            $logs = $user_obj->hasMany('appmodelsLog',['uid'=>'uid'])->asArray()->all(); //第一个uid是 log表的 第二个uid是user表的
            //print_r($logs);
            //一对一关系的查询
            $log_obj = Log::findOne(1);
            $user = $log_obj->hasOne(User::className(),['uid'=>'uid'])->asArray()->one(); //这段代码最好放在 Log 模型里面
            print_r($user);
        }
    }
    复制代码

    六、视图

    视图文件地址:F: estyiiviews控制器名视图名.php

    创建视图:F: estyiiviews estindex.php

    <?=$name?>
    <?=$age?>
    <?=print_r($age)?>

    调用视图:

    复制代码
    <?php
    namespace appcontrollers; //控制器的命名空间
    
    use yiiwebController; //控制器继承的 Controller 类的命名空间
    use YII; //框架全局类的命名空间
    
    
    
    class TestController extends Controller //控制器命名格式 名称Controller 驼峰法命名 文件名(TestController.php)与类名一致 
    {
        public function actionIndex() { //操作命名格式 action操作名
            $result = array('name'=>'张三','age'=>18,'arr'=>array('a','b'));
            return $this->renderPartial('index',$result); //调用视图 并把变量注入到视图中
        }
    }
    复制代码

    视图中安全输出数据:

    <?php
        use yiihelpersHtml; //转义
        use yiihelpersHtmlPurifier; //过滤
    ?>
    <?=Html::encode($name)?>
    <?=HtmlPurifier::process($name)?>

    关于视图的更多信息 http://www.yiichina.com/doc/guide/2.0/structure-views

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

    QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235

  • 相关阅读:
    Java实现计数排序
    Java实现计数排序
    Java实现计数排序
    Java实现计数排序
    Java实现计数排序
    Java实现完美洗牌算法
    Java实现完美洗牌算法
    Java实现完美洗牌算法
    Java实现完美洗牌算法
    Java实现完美洗牌算法
  • 原文地址:https://www.cnblogs.com/piwefei/p/5337570.html
Copyright © 2011-2022 走看看