之前主要搞C++,现在学习PHP,为了能够快速的理解MVC框架,根据buddy的建议,就选择了轻量级框架-CI,使用起来确实简单易学,并有详细的中文文档可够查阅。
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,包含几个关键目录:
$this->load->model("pages_model");
pages_model就可以作为Controller类的一个属性来调用了;$this->load->view('templates/header', $data);
来加载需要的V层文件。前面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代码地址