CI之旅

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 前言准备目录结构分析原理MVCCVM需要注意的地方自动生成表单action地址redirect小案例建表搭建CI环境配置数据库配置url新建MVC对应的文件创建MyControllerphp创建my_welcomephp作为视图文件创建user_modelphp作为模型层验证环境验证增加用户验证入库总结前言终于换系统了,因为之前一直是Windows7最老的哪个版本,也就是7600没有SP1补丁的版本。

前言

终于换系统了,因为之前一直是Windows7最老的哪个版本,也就是7600没有SP1补丁的版本。导致PHP高于5.2.8的版本都安装不上去, MongoDB最新版装不上去,甚至Python3.6什么的也装不上去。

这下好了,终于可以大展身手学点最新的东西了。于是下午先拿CodeIgniter下手,记录一下。

准备

配置好一个本地的PHP环境即可。我本人的环境是:

  • php7
  • mysql57
  • apache24

然后到http://codeigniter.org.cn/ 下载CI即可。
下载完把解压后的文件夹拷贝到我们的工作空间即可。
工作目录

目录结构分析

D:\PHP7\Apache24\htdocs\phpstorm\ci>tree .
卷 软件安装盘 的文件夹 PATH 列表
卷序列号为 0000-4823
D:\PHP7\APACHE24\HTDOCS\PHPSTORM\CI
├─application
│  ├─cache
│  ├─config          # 应用配置文件位置。
│  ├─controllers     # 控制器,连接MV
│  ├─core
│  ├─errors
│  ├─helpers         # 一些帮助库,生成URL时很有效
│  ├─hooks
│  ├─language
│  │  └─english
│  ├─libraries
│  ├─logs
│  ├─models          #  模型。存放与数据库表相对应的数据
│  ├─third_party
│  └─views
├─system             # CI框架运行的核心
│  ├─core
│  ├─database
│  │  └─drivers
│  │      ├─cubrid
│  │      ├─mssql
│  │      ├─mysql     # 已经不怎么用啦,用下面的那个就好了
│  │      ├─mysqli
│  │      ├─oci8
│  │      ├─odbc
│  │      ├─pdo
│  │      ├─postgre
│  │      ├─sqlite
│  │      └─sqlsrv
│  ├─fonts
│  ├─helpers
│  ├─language
│  │  └─english
│  └─libraries
│      ├─Cache
│      │  └─drivers
│      └─javascript
└─user_guide       # 用户帮助,可以查看一些小例子来模仿。
    ├─database
    ├─doc_style
    ├─general
    ├─helpers
    ├─images
    ├─installation
    ├─libraries
    ├─nav
    ├─overview
    └─tutorial

原理

一下子给这么多文件,不了解运行原理的话还真的是不好办。所以还是先来把握一下怎么让CI跑起来吧。

MVC

MVC是经典的开发模型,也就是我们经常见到的模型-视图-控制器的组合。好处就是最大限度的分离软件层次,降低耦合。等等等等。

在CI中,我们要学习的顺序是CVM。这也是和CI的运行原理一致的。其中Controller是联系Model和View的桥梁,也是框架工作的核心。

一方面Controller可以把来自View的客户端数据简要的处理一下,另一方面通过调用Model的方法将数据持久化到数据库中。

C

在CodeIgniter中,控制器文件放到Application/controllers目录下。
比如我下面新建了一个MyController.php的文件。

<?php
/**
 * @Author: 郭 璞
 * @File: mycontroller.php
 * @Time: 2017/3/30
 * @Contact: 1064319632@qq.com
 * @blog: http://blog.csdn.net/marksinoberg
 * @Description:
 **/
if ( !defined('BASEPATH') ) exit('No direct script access allowed');


class MyController extends CI_Controller
{
    public function test()
    {

        $this->load->view('my_welcome');
    }
}

有三点需要注意的地方:

  • 控制器文件最好是小写,且以.php结尾
  • 文件前部分添加if ( !defined('BASEPATH') ) exit('No direct script access allowed'); 来维护单入口。
  • 类首字母大写且继承自CI_Controller类

V

视图就比较简单了。放到application/views目录下即可。

里面的内容可以是HTML静态文件,也可以是纯PHP页面,还可以是混合的页面。

M

模型是相当重要的一部分了。如下我新建了一个user_model.php

<?php

/**
 * @Author: 郭 璞
 * @File: user_model.php
 * @Time: 2017/3/30
 * @Contact: 1064319632@qq.com
 * @blog: http://blog.csdn.net/marksinoberg
 * @Description: 表名称_model.php 代表了在数据库中的模型
 *             模型名称和文件名保持一致,但是记得要首字母大写并继承自CI_Model类。需要在构造方法中调用父类的构造方法
 **/
class User_model extends CI_Model
{

    function __construct()
    {
        // 必须手工的调用父类的构造方法
        parent::__construct();
    }

    /**
     * @param $data 代表了用户提交的数据
     */
    public function add_user($data)
    {
        // 完成数据的入库操作
        return $this->db->insert('hail_user', $data);
    }

    public function lst($param = 1) {
        echo "Model works!";
        // get的第一个参数是表名(不用添加表的前缀), 第二个参数是将要取得的数据的记录数
//        $obj = $this->db->get('hail_user', $param);
        $obj = $this->db->get('hail_user');
        return $obj->result_array();
    }


}

需要注意的有如下几个点:

  • 新建一个以PHP结尾的小写的文件
  • 类名保持和文件名一致,且首字母大写,继承自CI_Model类
  • 在子类的构造方法中手动调用父类的构造方法。

需要注意的地方

下面谈谈需要注意的地方。

自动生成表单action地址

一方面我们可以手动的指定,但是这样的话会难于维护。所以还是借助site_url函数来实现。

使用site_url的前提有如下两个点:

  • 在application/config.php中配置了$config[‘BASE_URL’]
  • 在调用site_url之前使用了$this->load->helper('url');//(作用就是调用了system/helpers/url_helper.php中的site_url方法)

redirect

类似于上面所述。如果不这么处理可能会出现

Undefined function redirect

小案例

下面准备做一个简单的注册的小例子。为了方便就不做数据验证了。

建表

在数据库中建立如下字段的表结构

DROP TABLE IF EXISTS `hail_user`;
CREATE TABLE `hail_user` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primark key',
  `username` varchar(30) NOT NULL,
  `password` char(32) NOT NULL,
  `email` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

搭建CI环境

把从官网下载好的文件解压,放到自己的工作空间下。

配置数据库

在application/config/database.php 中对于自己的数据库环境进行配置。

$active_group = 'default';
$active_record = TRUE;

$db['default']['hostname'] = '127.0.0.1';
$db['default']['username'] = 'root';
$db['default']['password'] = 'root';
$db['default']['database'] = 'test';
$db['default']['dbdriver'] = 'mysqli';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

配置url

$config['base_url'] = 'http://localhost/phpstorm/ci';

新建MVC对应的文件

创建MyController.php

<?php
/**
 * @Author: 郭 璞
 * @File: mycontroller.php
 * @Time: 2017/3/30
 * @Contact: 1064319632@qq.com
 * @blog: http://blog.csdn.net/marksinoberg
 * @Description:
 **/
if ( !defined('BASEPATH') ) exit('No direct script access allowed');


class MyController extends CI_Controller
{
    public function test()
    {

        $this->load->view('my_welcome');
    }


    public function add_user()
    {

        $data = [
            'username'=>$_POST['username'],
            'password'=>md5($_POST['password']),
            'email'=>$_POST['email']
        ];

//        $id = 3;
//        $username = "assfsfbdfhdbhdb";
//        $password = "ASDSADDSSDS";
//        $email = "38324y34y34@7y34y.com";
//        $data = [
//            'username' => $username,
//            'password' => $password,
//            'email' => $email
//        ];

//        $this->load->helper('url');
//        echo "CI中生成表单action地址的方法。必须现在conf中配置BASE_URL".site_url('mycontroller/add_user');
        $this->load->database();
        $this->load->model('user_model');
        $flag = $this->user_model->add_user($data);
        if ( $flag == TRUE ) {
//            echo "Insert Operation Succeed!";
            // 使用路径生成器之前必须先引入helper('url')
            $this->load->helper('url');
            redirect('mycontroller/call_user_model');
        } else {
            echo "Insert Operation Failed!";
        }
    }

    /**
     * 让前台访问这个网址看到视图。而真正处理表单则是add_user来实现的。
     *
     * 表单中能生成action地址的前提是:helper('url')并且在conf下配置了BASE_URL
     */
    public function show_form() {
        $this->load->helper('url');
        $this->load->view('my_welcome');
    }


    // 调用模型里面的方法
    public function call_user_model()
    {
        echo "It works!";
        // 载入数据库操作类
        $this->load->database();
        // 实例化模型
        $this->load->model('user_model');
        // 模型实例化之后的调用。经过了load操作的话,系统会将实例化的对象赋值给同名的属性上,可被直接的使用
        $users = $this->user_model->lst();
        $this->load->view('my_welcome', ['users' => $users]);
    }

}

创建my_welcome.php作为视图文件

<?php
/**
 * @Author: 郭 璞
 * @File: my_welcome.php
 * @Time: 2017/3/30
 * @Contact: 1064319632@qq.com
 * @blog: http://blog.csdn.net/marksinoberg
 * @Description:
 **/


?>
<h2>个人详细信息</h2>
<?php
foreach ($users as $user) {
    ?>
    <ul>
        <li>编号: <?php echo $user['id']; ?></li>
        <li>姓名: <?php echo $user['username']; ?></li>
        <li>密码: <?php echo $user['password']; ?></li>
        <li>邮箱: <?php echo $user['email']; ?></li>

    </ul>
    <?php
}
?>
<hr>
<h2>申请加入</h2>
<form action="<?php echo site_url('mycontroller/add_user')?>" method="post" enctype="multipart/form-data">

    Username:  <input type="text" name="username"><br>
    Password: <input type="password" name="password"><br>
    Email: <input type="text" name="email"> <br>
    <br>
    <input type="submit" value="提交">

</form>

创建user_model.php作为模型层

<?php

/**
 * @Author: 郭 璞
 * @File: user_model.php
 * @Time: 2017/3/30
 * @Contact: 1064319632@qq.com
 * @blog: http://blog.csdn.net/marksinoberg
 * @Description: 表名称_model.php 代表了在数据库中的模型
 *             模型名称和文件名保持一致,但是记得要首字母大写并继承自CI_Model类。需要在构造方法中调用父类的构造方法
 **/
class User_model extends CI_Model
{

    function __construct()
    {
        // 必须手工的调用父类的构造方法
        parent::__construct();
    }

    /**
     * @param $data 代表了用户提交的数据
     */
    public function add_user($data)
    {
        // 完成数据的入库操作
        return $this->db->insert('hail_user', $data);
    }

    public function lst($param = 1) {
        echo "Model works!";
        // get的第一个参数是表名(不用添加表的前缀), 第二个参数是将要取得的数据的记录数
//        $obj = $this->db->get('hail_user', $param);
        $obj = $this->db->get('hail_user');
        return $obj->result_array();
    }


}

验证环境

首先访问http://localhost/phpstorm/ci/index.php
首页

验证增加用户

如我们所知,CI是基于单入口来运行的。所以访问一个视图需要通过控制器来实现。

所以我们通过下面这种格式来访问一个视图文件。

${base_url}/index.php/控制器名称/返回视图的控制器里面的方法

举个小例子:

http://localhost/phpstorm/ci/index.php/mycontroller/show_form

  • base_url 就是我们在application/config.php中配置的$config[‘base_url’]。

  • 而mycontroller就是我们自定义的控制器

  • show_form就是mycontroller控制器中的一个用于展示视图的方法。

最终我们看到的效果是:
视图文件

验证入库

下面我们填写完表单,然后提交即可。
填写表单

因为代码中使用了重定向技术所以我们可以看到浏览器地址栏中的地址会发生变化。
注册成功

查看数据库中字段

数据库中成功插入记录

如此,便完成了使用CodeIgniter框架的注册的小案例了。虽然这是简单的不能再简单的案例了。

但是对于这个过程的把握才是最重要的。了解CI的工作原理比单纯的搞一个小案例重要的多。

我觉得只要是理解了控制器控制下的视图与模型的处理,就差不多可以啦。

总结

今天本来不打算写的,因为这实在是没有含金量。写着写着发现没什么可写的。算了,就这样吧。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Devops jenkins Java
【devops】六、CI、CD入门操作
【devops】六、CI、CD入门操作
141 0
|
11月前
|
存储 监控 关系型数据库
CI的架构
CI的架构
|
测试技术 数据安全/隐私保护
|
存储 缓存 运维
Gitlab CI 小试牛刀
前言 前端工程化中 CI 是必不可少的一环,大家的团队中或多或少都有不同的 CI 能力,有的可能由运维同学使用 JIRA 配置(前司),更多的相信已经迁移到 Gitlab 到 CI/CD 中。那么今天就来聊聊什么是 CI 以及如何在 Gitlab 中配置 CI 能力。
|
jenkins 应用服务中间件 Shell
自动化部署之旅 - 当我放弃了Jenkins而选择了Drone CI
一直以来对于项目的部署管理我都是采用Jenkins,但其实我使用到的也只是它接收webhook的功能,然后触发对应的项目预设shell脚本来运行部署,最近突然心血来潮,想尝试下不同的集成构建方案,在简单调研后选择了Drone,其轻量、高颜值的特点立刻吸引了我。
|
测试技术 Linux
CI 工具
CI,即continues intergration, 敏捷开发过程中贯彻不停迭代的重要工具, 能每天自动按照脚本生成项目可执行文件,并调用unit test等工具进行单元测试生成报告, 还在继续试用 cruise control这个 由uml名人参...
947 0
|
测试技术 Shell 持续交付
gitlab-ci的简易入门—基于python项目的CI演示
gitlab-ci的简易入门—基于python项目的CI演示
gitlab-ci的简易入门—基于python项目的CI演示
|
持续交付 数据安全/隐私保护 Ruby
Travis CI简介
什么是持续集成? Travis CI 提供的是持续集成服务(Continuous Integration,简称 CI)。它绑定 Github 上面的项目,只要有新的代码,就会自动抓取。然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。
499 0
Travis CI简介
|
敏捷开发 缓存 资源调度
分享我在前后端分离项目中Gitlab-CI的经验
今天继续聊一聊为前后端分离搭建Gitlab-CI的额外经验。
分享我在前后端分离项目中Gitlab-CI的经验
|
运维 jenkins Devops
「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点(一)
「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点(一)
349 0