前言
终于换系统了,因为之前一直是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的工作原理比单纯的搞一个小案例重要的多。
我觉得只要是理解了控制器控制下的视图与模型的处理,就差不多可以啦。
总结
今天本来不打算写的,因为这实在是没有含金量。写着写着发现没什么可写的。算了,就这样吧。