CI框架
angularJs框架(运行一些设计模式、依赖注入)、laravel(依赖注入)。学习思想上的东西。
今天CI框架会带大家看源码(前题声明难度有点大)。
①-框架简介
CI框架,是一个非常小巧和轻量级的框架,也是最容易入门的框架(里面有一个按需加载的概念,CI框架很多东西都不会自动的载入,当你需要的时候,需要自己去手工的载入,所以它的性能在众多框架中算是比较快的一个(php框架),至少比laravel快了很多。在众多框架中laravel应该是算得上是最慢的。
目前比较流行的框架有CI、laravel;同时还有一些性能为主的C语言框架,例如yaf(c语言框架、使用C语言为php编写了一个扩展windows php_yaf.dll文件 mbstring.dll Linux php_yaf.so—php.ini)、phaclon(这个框架是国外开发的,性能完全不必yaf差,普及度不及国人开发的yaf)等。
框架就是php自带的,直接可以使用,yaf框架是不提供模型的。
class UserController extends Yaf_Controller{
}
面对过程、面向对象、面向切面?
答:这三种思想没有哪一个是最好,只有合适自己的业务就是最优的。
问题:为什么laravel这么慢,还有那么多企业在使用?
答:谈一下个人的理解。
- 属于跟风比较多。(很多企业压根就不了解这个框架,只是看到市场现状很多人在使用,那么觉得也要跟上潮流、不得不使用)鸭子现象(从众)
- 这个框架应用了很多的设计模式,便于开发和维护(并且还要知道laravel产品就是syfomy框架的儿子)
- 非常明显的一个特点,重路由设计。每一个控制器的方法的访问都必须要设计一个URL地址(路由规则)。index.php/user/add ——-> goods/lst 设置在laravel里面可以不存在控制器、也可以不存在模型,视图也可以不存在,但是路由必须存在(可以把所有的业务逻辑放在路由里面完成)。主要是现在web项目相关的项目更倾向于前后端相分离(API接口—》URL地址—》路由规则)。
- 目前框架使用composer的管理工具,可以把互联网上所有php好的工具类库全部整合在一起。(composer理解成node的npm或者Linux的yum工具、前端的bower) composer install upload
- 并且laravel框架是完全的面向对象的框架,并且只有面向对象的编程思想才可以更好的和现实社会形成联系。(面向对象里面的思想可以和一物一世界完全对应)(面向过程、面向对象、面向切面【钩子函数的思想】…..)
TP里面钩子函数:只需要用户定义在特定的位置,不需要手工的执行,框架会在特定的时间执行这个钩子函数,对数据进行处理。(AOP就是面向切面编程的缩写)
②-CI框架简介
- 什么CI框架?
答:是一个外国人开发的小巧的框架。目前存在两个主流分支版本,一个是3.x系列,一个是2.x系列。本次课程学习是2.x系列,企业基本都是选择这个版本。(LTS:长时间维护,3年左右的维护期)
③-CI框架入门使用
框架资料
- 在虚拟主机目录解压对应的框架
整体目录结构
分析核心代码目录
application目录
例如:自己扩展CI的控制器类
- ci框架的访问
两种访问方式,直接访问,全路径访问
全路径访问(默认控制器是welcome控制器、方法是index方法;URL访问模式叫做pathinfo)
index.php?m=Home&c=Index&a=index (普通模式)
index.php/Home/Index/index (pathinfo模式)
index.php?s=Home&Index&lst(兼容模式)
Index-lst-12.html —-> index/Home/Index/lst/12 (重写模式)
④-CI框架-控制器
如何上手一个CI框架?
答:1. 学习控制器 2. 学习视图 3. 学习模型
具体:
一个控制器如何学习?
- 学习控制器写在哪里?
- 控制器文件的命令如何命名?
- 文件里面的内容如何书写?有哪些注意事项?
- 控制器里面的方法如何书写?注意事项?
- 控制器方法里面如何载入视图?
- 如何给视图赋值变量?
- 视图里面如何显示变量信息?
- 最后如何在控制器里面实例化模型,从数据库获取数据?
实操:
- 控制器文件写在哪里?
- 控制器文件如何命名?
- 控制器里面的内容如何书写?
确保所有的请求都是从单入口开始的。
- 控制器里面的方法如何书写?
浏览器访问
注意:在CI框架里面,方法名称不能以_下划线开头,在浏览器是无法访问,但是不影响在类的方法内部被调用
效果
注意:内部使用不受影响
5. 注意:CI框架控制器里面有一个方法比较特殊,叫做_remap方法,该方法会在其他方法被调用之前,自动的调用
效果
实际操作:可以做一个简单的前台权限的验证操作。
验证
6. 方法里面如何载入视图?
效果
⑤-CI框架-视图
思考:
- 视图写在哪里?
- 视图文件如何命名?
- 视图内容如何书写?
- 控制器如何调用视图,如何给视图赋值
- 视图里面如何显示变量(是否可以使用标签语法、或者原生写法)
- 视图可以分目录管理
- 控制器里面可以载入多个视图
- 视图可以分目录管理,那么控制器是否可以分目录管理?可以(分目录其实就是之前其他框架里面的分模块管理:前台、后台)
实操
- 写在哪里?
- 视图文件如何命名?
- 视图里面的内容如何书写?
4. 如何在控制器里面载入视图文件?
效果
5. 如何在控制器里面给视图赋值变量,然后让变量在视图文件显示?
第一种方式赋值[使用少]
视图代码
效果
第二种方式[使用多]
视图代码
效果
6. 注意:CI框架里面的控制器和视图是否可以分目录保存?
控制器分目录,书写位置:
控制器代码:
访问:
视图分目录,书写位置:
控制器代码
效果
注意:CI框架里面的控制器里面可以载入多个视图
视图文件位置:
控制器代码:
效果
⑥-数据库操作
思考:
- 在CI如何书写配置信息?
- 在CI里面如何从数据库里面获取数据?
实操:
- 建一个用户表
- 先配置数据库的信息
配置
- 在控制器里面获取数据库的数据
- 在视图里面显示
视图
效果
注意事项:在获取数据操作的时候,必须连接数据[$this->load->datebase()], 但是有的时候容易忘记,所以可以自动载入
在控制器里面就不需要在手工的连接
这个也被称为CI里面的按需加载。【要连接数据库,才使用$this->load->database()连接】
⑦-CI框架-模型
思考:
- 模型文件写哪里?
- 模型文件如何命名?
- 模型文件里面的内容如何书写?
- 在控制器里面如何调用模型?
实操:
- 模型文件写哪里?
- 模型文件如何命名的问题?
- 模型里面的内容书写
书写一个get_user方法获取数据
在控制器里面调用
视图显示数据
简单的实现一套用户的curd
使用CI框架实现一套完整的增删改查。
①-用户增加
- 在user.php控制器文件增加一个add_user方法
- 增加一个add_user.php视图文件
备注:在form表单提交的actione里面使用site_url函数之前,需要在自动载入里面进行配置。
- 在user_model.php文件里面增加一个add_user方法,入库数据
②-用户展示
1. 在user_model.php模型文件增加一个get_user方法
- 在user.php控制器里面增加一个get_user方法
3. 在lst.php视图显示数据
③-用户删除
- 修改lst.php视图文件,增加删除链接
效果
- 在user.php控制器里面定义del_user方法,完成删除操作
注意:获取地址栏里的主键id,需要使用按段获取
3. 在user_model.php模型里面定义一个del_user方法【特别注意:在CI里面做数据删除的时候,需要根据受影响的行来判断数据是否删除成功!】【$this->db->delete方法的返回值是sql语句是否成功运行】
调试技巧:获取上一次执行的sql语句。
④-用户编辑
- 在lst.php视图里面增加一个编辑的链接
效果
- 在user.php控制器里面增加一个edt_user方法
- 在user_model.php模型文件增加两个方法find_one和edt_user方法
- 增加一个edt.php视图文件
三、跳转函数封装
由于CI框架里面的跳转函数是redirect函数,它不能实现跳转的时候带提示信息。
我们可以参照TP的实现,封装一个带提示的跳转函数。
- 参照TP的实现,完成一个函数的封装,写到如下位置
- 调用
自动载入自己定义的函数
使用
效果
四、分页插件
①-Ajax分页
在CI里面实现Ajax无刷新分页的效果,还使用一个pagination插件。
网站:http://www.zhangxinxu.com/jq/pagination_zh/
- 在项目引入分页插件
- 在页面调用分页插件css和js
注意:必须先引入jQuery
- 定义数据显示容器和分页字符串
- 在js里面调用
在user.php控制器的get_user方法获取总记录
在user_model.php文件定义一个方法获取总记录
分页插件调用
分页页码点击回调,发送Ajax获取数据
数据格式化函数
- user.php后台返回Ajax数据
五、CI框架源码分析
①-分析入口文件
②-CI的核心引导类
注意:一般开源产品的common.php里面存放都是项目必须要使用的函数。
先分析一下common.php里面的函数【重点分析】
load_class函数
函数主要是配置load_class使用
③-CI里面的模型实例化1-装载器分析
在上面user.php文件里面完成模型的实例化,底层原理是怎么样的?
思考:在控制器里面$this->load代表是什么?
答:$this->load 这个属性在用户自定义的控制器里面是不存在的,会去父类的控制器里面查询CI_Controller.php里面查找
通过查找发现父类里面的构造方法里面使用load_calss(‘Loader’,’core’)进行赋值操作。查看 load_class.php的源码,进行分析
面试题:CI装载器是做什么的?主要是负责类的实例化操作,是system/core/loader.php的实例 |
先记住:load_class功能:1. 载入类 2. 实例化类 3. 记录类
并且:整个CI框架没有类的自动载入机制,全部使用load_class完成。
④-CI里面的模型实例化2-实例化模型
$this->load->model(‘user_model’,’user’); === new CI_Loader()->model(‘user_model’,’user’)
底层原理:
$this->load本质就是CI_Loader的实例,所以我们需要分析一下Loader.php这个文件里面的内容,在分析一下里面model方法,这个方法是实例化模型的关键。
⑤-CI模型里面的db属性是咋回事?
之前:$this->db = new DB(); 这里的$this也是超级对象(get_instance()函数的返回值,或者就是CI_Controller::instance属性—$this)
- 查找db属性,肯定是在自己的类里面查找,不存在则去父类里面查找
- 查看超级对象下是否存在db属性
3. 查看系统的控制器
- 查看装载器的方法
- 分析装载器里面的_ci_autoloader方法
- 查看装载器的$this->dabase()方法