CI框架学习总结
2016-01-20 15:26
696 查看
之前主要搞C++,现在学习PHP,为了能够快速的理解MVC框架,根据buddy的建议,就选择了轻量级框架-CI,使用起来确实简单易学,并有详细的中文文档可够查阅。
URI字段含义:
C字段为routes.php中定义需要调用的controller类名,m为该类中的方法,param1….为参数可以在定义方法时来设定参数,从而该值自动传递给该方法;也可以通过
对于URL字段路由规则在application/config/routes.php中来进行配置,格式:
下面,主要说一下application,包含几个关键目录:
config文件夹,存放一些配置文件,包括路由(routes.php)、数据库(database.php)、基本配置(config.php,如base_url、charset等)、memcache.php、需要自动加载的底层对象(autoload.php)等;
controllers文件夹,C层文件都存放在这个文件夹中,因为是按类名classname在该文件夹中检索(classname.php)的文件,所以类名要与文件名相同。controller类继承CI_Controller类,在构造函数中首先调用父类的构造函数parent:__construct,需要加载M层自定义类时,调用
model文件夹,M层文件,主要封装一些底层数据文件,如数据库等。
view文件夹,V层文件,主要保存前端的一些文件,包括css、js、html(需要定义为.php文件)。可以在controller层通过
其他文件夹,因为没用到,就不介绍了。
在codeignite.php中根据实例化Router类$RTR。在Router类的构造函数中会读取routers.php配置文件、解析URI字段,并设置Router::class (controller) 和Router::method属性;
实例化controller类。Controller采用单例模式,全局只有一个controller类,可以通过coderignite.php中get_instance()方法返回,该实例。
在CI_Controller构造函数中实例化Loader类。Loader类主要用来设置controller中的属性,例如model,helper,library中封装的类,通过在controller中调用:
这样就可以使用model层封装的对象了。
加载view层原理:
通过Loader::view()方法来实现,view()调用_ci_load()来实现:
将Controller中的所有数据复制到Loader类中从而使所有的controller数据可以在view层使用,这也是为什么我在一开始使用CI时,发现controller中的所有数据可以通过$this调用。
最后通过
include view层定义的文件。
CI框架整体结构比较清晰,代码量较少,比较适合初接触MVC框架的同学。
CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为开发者们建立功能完善的 Web 应用程序。 -摘自官网
目录结构
CI框架的核心文件都存放在system文件夹中,在根目录下的index.php中可以通过变量$application_folder = 'application';配置用户目录文件夹,一般定义在件在application文件夹中。system/core/CodeIgniter.php文件为框架的入口文件。
URI字段含义:
sites.com/index.php/C/m/param1/param2/.....
C字段为routes.php中定义需要调用的controller类名,m为该类中的方法,param1….为参数可以在定义方法时来设定参数,从而该值自动传递给该方法;也可以通过
$this->uri->segment_array();来返回字段数组,arrary( 1=>controller, 2=>method, 3=>param1, ….)。
对于URL字段路由规则在application/config/routes.php中来进行配置,格式:
$route['pages/editor'] = 'pages/editor'; $route['default_controller'] = 'pages'; //默认Controller $route['news/(:any)'] = 'news/view/$1'; $route['news'] = 'news'; //news字段解析news Controller类
下面,主要说一下application,包含几个关键目录:
config文件夹,存放一些配置文件,包括路由(routes.php)、数据库(database.php)、基本配置(config.php,如base_url、charset等)、memcache.php、需要自动加载的底层对象(autoload.php)等;
controllers文件夹,C层文件都存放在这个文件夹中,因为是按类名classname在该文件夹中检索(classname.php)的文件,所以类名要与文件名相同。controller类继承CI_Controller类,在构造函数中首先调用父类的构造函数parent:__construct,需要加载M层自定义类时,调用
$this->load->model("pages_model");pages_model就可以作为Controller类的一个属性来调用了;
model文件夹,M层文件,主要封装一些底层数据文件,如数据库等。
view文件夹,V层文件,主要保存前端的一些文件,包括css、js、html(需要定义为.php文件)。可以在controller层通过
$this->load->view('templates/header', $data);来加载需要的V层文件。
其他文件夹,因为没用到,就不介绍了。
MVC实现原理
前面balabala.了.MVC文件布局,并没有说框架的实现机制,现在简单介绍一下,如何实现控制层,数据层,视图层分离的:codeignite.php $RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL);
在codeignite.php中根据实例化Router类$RTR。在Router类的构造函数中会读取routers.php配置文件、解析URI字段,并设置Router::class (controller) 和Router::method属性;
codeignite.php $class = ucfirst($RTR->class); $method = $RTR->method; .......... $CI = new $class();
实例化controller类。Controller采用单例模式,全局只有一个controller类,可以通过coderignite.php中get_instance()方法返回,该实例。
CI_Controller.php $this->load =& load_class('Loader', 'core'); $this->load->initialize();
在CI_Controller构造函数中实例化Loader类。Loader类主要用来设置controller中的属性,例如model,helper,library中封装的类,通过在controller中调用:
controller: $this->load->model("pages_model"); $this->load->helper('url_helper'); $this->load->library('session');
这样就可以使用model层封装的对象了。
加载view层原理:
$this->load->view('templates/header', $data);
通过Loader::view()方法来实现,view()调用_ci_load()来实现:
Loader.php /** * Internal CI Data Loader * * Used to load views and files.用来加载view层文件 * * Variables are prefixed with _ci_ to avoid symbol collision with * variables made available to view files. * * @used-by CI_Loader::view() * @used-by CI_Loader::file() * @param array $_ci_data Data to load * @return object */ protected function _ci_load($_ci_data) {..................}
Loader.php // This allows anything loaded using $this->load (views, files, etc.) // to become accessible from within the Controller and Model functions. $_ci_CI =& get_instance(); foreach ( get_object_vars($_ci_CI) as $_ci_key => $_ci_var ) { if ( ! isset($this->$_ci_key) ) { $this->$_ci_key =& $_ci_CI->$_ci_key; } }
将Controller中的所有数据复制到Loader类中从而使所有的controller数据可以在view层使用,这也是为什么我在一开始使用CI时,发现controller中的所有数据可以通过$this调用。
最后通过
if ( ! is_php( '5.4' ) && ! ini_get('short_open_tag') && config_item('rewrite_short_tags') === TRUE ) { echo eval( '?>' . preg_replace('/;*\s*\?>/', '; ?>', str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))) ); } else { include( $_ci_path ); // include() vs include_once() allows for multiple views with the same name }
include view层定义的文件。
总结
CI框架总体通过使用一个单例的CI_Controller对象来进行操作,它包含一个属性CI_Controller::load来加载所有需要的文件,并将CI_Controller中的属性引用到Loader类中,从而可以在view层使用。CI框架整体结构比较清晰,代码量较少,比较适合初接触MVC框架的同学。
代码
git代码地址相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- 插件管理框架 for Delphi(一)
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- 使用CSS框架布局的缺点和优点小结
- ASP.NET、ASP、PHP、JSP之间有什么区别?
- PHP VBS JS 函数 对照表