CodeIgniter简单理解
作者:烨竹
学习起因:公司老是让我做小需求,所以想学习一门较为轻量级的php框架,自己搭建的MVC框架老是出问题,所以在网上找了一段时间,选择CodeIgniter框架;
目录结构
myshop
|-----system 框架程序目录
|-----core 框架的核心程序
|-----CodeIgniter.php 引导性文件
|-----Common.php 加载基类库的公共函数
|-----Controller.php 基控制器类文件:CI_Controller
|-----Model.php 基模型类文件:CI_Model
|-----Config.php 配置类文件:CI_Config
|-----Input.php 输入类文件:CI_Input
|-----Output.php 输出类文件:CI_Output
|-----URL.php URL类文件:CI_URl
|-----Router.php 路由类文件:CI_Router
|-----Loader.php 加载类文件:CI_Loader
|-----helpers 辅助函数
|-----url_helper.php url相关的辅助函数,如:创建url的辅助函数
|-----captcha_helper.php创建图形验证码的辅助函数
|-----libraries 通用类库
|-----Pagination.php 通用分页类库
|-----Upload.php 通用文件上传类库
|-----Image_lib.php 通用图像处理类库
|-----Session.php 通用session类库
|-----language 语言包
|-----database 数据库操作相关的程序
|-----DB_active_rec.php 快捷操作类文件(ActiveRecord)
|-----fonts 字库
|-----application 项目目录
|-----core 项目的核心程序
|-----helpers 项目的辅助函数
|-----libraries 通用类库
|-----language 语言包
|-----config 项目相关的配置
|-----config.php 项目相关的配置文件
|-----database.php 数据库相关的配置文件
|-----autoload.php 设置自动加载类库的配置文件
|-----constants.php 常量配置文件
|-----routes.php 路由配置文件
|-----controllers 控制器目录
|-----welcome.php 控制器文件,继承CI_Controller
|-----models 模型目录
|-----welcome_model.php 模型文件,继承CI_Model
|-----views 视图目录
|-----welcome.php 视图模板文件,默认后缀名为.php
|-----cache 存放数据或模板的缓存文件
|-----errors 错误提示模板
|-----hooks 钩子,在不修改系统核心文件的基础上扩展系统功能
|-----third_party 第三方库
|-----logs 日志
|-----index.php 入口文件
url
相关文件: .htaccess 文件 config/config.php
application/config.php
application/config/routes.php(:num) 匹配只含有数字的一段。 (:any) 匹配含有任意字符的一段;:any 会被转换为 [^/]+ , :num 会被转换为 [0-9]+
$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
URL 的第一段是 "product" ,第二段是数字时,将重定向到 "catalog" 类的 "product_lookup_by_id" 方法,并将第二段的数字作为参数传递给它。
如果你使用逆向引用,你需要使用美元符号代替双斜线语法
HTTP 动词(GET、PUT、POST、DELETE、PATCH)
$route['products/(:num)']['DELETE'] = 'product/delete/$1';
移除 URL 中的 index.php
根目录下添加.htaccess
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</IfModule>
控制器
相关文件: application/controllers/
application/config/routes.php 定义默认控制器重映射方法:_remap()如果你的控制包含一个 _remap() 方法,那么无论 URI 中包含什么参数时都会调用该方法。 它允许你定义你自己的路由规则,重写默认的使用 URI 中的分段来决定调用哪个方法这种行为
处理输出:_output()如果你的控制器含有一个 _output() 方法,输出类将会调用该方法来显示数据, 而不是直接显示数据。该方法的第一个参数包含了最终输出的数据
私有方法:将方法声明为 private 或 protected 并且在方法名前加上一个下划线前缀也可以让该方法无法访问
请不要将你的控制器命名为这些:
CI_Controller
Default
index
函数
is_php()
is_really_writable()
load_class()
is_loaded()
get_config()
config_item()
show_error()
show_404()
log_message()
set_status_header()
get_mimes()
html_escape()
remove_invisible_characters()
is_https()
function_usable()
get_instance()
_error_handler()
_exception_handler()
_stringify_attributes()
变量
$config
$db
$lang
常量
ENVIRONMENT
FCPATH
SELF
BASEPATH
APPPATH
VIEWPATH
CI_VERSION
MB_ENABLED
ICONV_ENABLED
UTF8_ENABLED
FILE_READ_MODE
FILE_WRITE_MODE
DIR_READ_MODE
DIR_WRITE_MODE
FOPEN_READ
FOPEN_READ_WRITE
FOPEN_WRITE_CREATE_DESTRUCTIVE
FOPEN_READ_WRITE_CREATE_DESTRUCTIVE
FOPEN_WRITE_CREATE
FOPEN_READ_WRITE_CREATE
FOPEN_WRITE_CREATE_STRICT
FOPEN_READ_WRITE_CREATE_STRICT
SHOW_DEBUG_BACKTRACE
EXIT_SUCCESS
EXIT_ERROR
EXIT_CONFIG
EXIT_UNKNOWN_FILE
EXIT_UNKNOWN_CLASS
EXIT_UNKNOWN_METHOD
EXIT_USER_INPUT
EXIT_DATABASE
EXIT__AUTO_MIN
EXIT__AUTO_MAX
视图
相关文件:application/views/
加载视图
$this->load->view('name');
向视图添加动态数据
通过视图加载方法的第二个参数可以从控制器中动态的向视图传入数据, 这个参数可以是一个 数组 或者一个 对象
数组:
$data = array(
'title' => 'My Title',
'heading' => 'My Heading',
'message' => 'My Message'
);
$this->load->view('blogview', $data);
当你使用对象时,对象中的变量会转换为数组元素
将视图作为数据返回,默认作为视图返回
$string = $this->load->view('myfile', '', TRUE);
模型
相关文件:application/models/
加载并访问模型
$this->load->model('models下面的模型方法位置',重命名,是否自动连接数据库/参数配置数据库);
$this->model_name->method();
class Blog_controller extends CI_Controller {
public function blog()
{
$this->load->model('blog');
$data['query'] = $this->blog->get_last_ten_entries();
$this->load->view('blog', $data);
}
}
辅助函数
相关文件: system/helpers
application/helpers
application/config/config.php加载和使用辅助函数
$this->load->helper('name');
name可以是字符串和数组
$this->load->helper(
array('helper1', 'helper2', 'helper3')
);
CodeIgniter 类库
相关文件:system/libraries/
application/config/config.php$this->load->library('class_name')
name可以是字符串和数组
创建自定义库类
初始化类时传入参数
在加载类库的时候,你可以通过第二个参数动态的传递一个数组数据,该数组将被传到 你的类的构造函数中:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('someclass', $params);
如果你使用了该功能,你必须在定义类的构造函数时加上参数:
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
public function __construct($params)
{
// Do something with $params
}
}
get_instance() 用来获取CI 的全局超级对象,CI 是单例模式的框架,所有全局有一个超级对象。因为只有一个实例,所以无论这个函数使用多少次都不会消耗资源的。一般来说,只有在helper或library中才使用get_instance
驱动器:
所在目录:system/libraries/
驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类可以访问父类, 但不能访问兄弟类。在你的 控制器 中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成很多离散的类。
核心系统类:
相关文件:application/core
application/config/config.php
system/compat/core/CodeIgniter每次 CodeIgniter 运行时,都有一些基础类伴随着核心框架自动的被初始化。但你也可以使用你自己类来替代这些核心类或者扩展这些核心类。
大多数用户一般不会有这种需求,但对于那些想较大幅度的改变 CodeIgniter 的人来说,我们依然提供了替换和扩展核心类的选择
钩子 - 扩展框架核心
相关文件:application/config/config.php
application/config/hooks.phpCodeIgniter 的钩子特性提供了一种方法来修改框架的内部运作流程,而无需修改 核心文件。CodeIgniter 的运行遵循着一个特定的流程,你可以参考这个页面的 应用程序流程图 。但是,有些时候你可能希望在 执行流程中的某些阶段添加一些动作,例如在控制器加载之前或之后执行一段脚本, 或者在其他的某些位置触发你的脚本
自动加载资源
相关文件:application/config/autoload.php
application/config/config.phpCodeIgniter 的"自动加载"特性可以允许系统每次运行时自动初始化类库、辅助函数和模型。 如果你需要在整个应用程序中全局使用某些资源,为方便起见可以考虑自动加载它们
公共函数
is_php($version):判断当前运行的 PHP 版本是否高于或等于你提供的版本
is_really_writable($file):判断是否可写
config_item($key):访问单个配置项
set_status_header($code[, $text = '']):用于手动设置服务器的 HTTP 状态码
remove_invisible_characters($str[, $url_encoded = TRUE]):防止在 ASCII 字符串中插入空字符,
html_escape($var)
可以接受字符串参数外,还可以接受数组参数。
它在防止 XSS 攻击时很有用。
get_mimes():返回 application/config/mimes.php 文件中定义的 MIME 数组的 引用
is_https():判断是否是https
is_cli():
该函数会检查 PHP_SAPI 的值是否是 'cli' ,或者是否定义了 STDIN 常量。
function_usable($function_name)
检查一个函数是否可用,可用返回 TRUE ,否则返回 FALSE
兼容性函数
哈希相关:
password_get_info — 返回指定散列(hash)的相关信息password_hash — 创建密码的散列(hash)
password_needs_rehash — 检测散列值是否匹配指定的选项
password_verify — 验证密码是否和散列值匹配
hash_equals — 可防止时序攻击的字符串比较
hash_pbkdf2 — 生成所提供密码的 PBKDF2 密钥导出
错误处理
相关文件:index.php
config/constants.php相关函数
生成错误信息:
show_error($message, $status_code, $heading = 'An Error Was Encountered')
show_404($page = '', $log_error = TRUE)找不到的文件路径
log_message($level, $message)向你的日志文件中写入信息
网页缓存
相关目录:application/cache缓存文件
开启缓存
$this->output->cache($n);$n表示缓存更新时间单位分钟
如果你需要手工删除缓存,你可以使用 delete_cache() 方法
$this->output->delete_cache('/foo/bar');
程序分析
相关文件:application/config/profiler.php
分析器类会在页面下方显示基准测试结果,运行过的 SQL 语句, 以及 $_POST 数据。这些信息有助于开发过程中的调试和优化
启用分析器 $this->output->enable_profiler(TRUE);
禁用分析器 $this->output->enable_profiler(FALSE);
以 CLI(命令行) 方式运行
使用命令行的情况
使用 cron 定时运行任务,而不需要使用 wget 或 curl
通过函数 is_cli() 的返回值来让你的 cron 页面不能通过 URL 访问到
制作交互式的任务,例如:设置权限,清除缓存,备份等等与其他语言进行集成,例如可以通过 C++ 调用一条指令来运行你模型中的代码
应用程序(模块)
相关文件:index.php
$application_folder = 'application';
多环境处理
相关文件: index.php $_SERVER['CI_ENV']
.htaccess如果将 ENVIRONMENT 常量设置为 'development' ,当发生 PHP 错误时错误信息会显示到浏览器上。与之相对的,如果将常量设置为 'production' 错误输出则会被禁用
在视图文件中使用 PHP 替代语法
相关文件:config/config.php
Echo 替代语法
<? php echo $variable ; ?>
可以写成
<?= $variable ?>
控制结构的替代语法(if、for、foreach、while)
< ul >
<? php foreach ( $todo as $item ) : ?>
< li > <? = $item ?> </ li >
<?php endforeach ; ?>
</ ul >
<? php if ( $username === 'sally' ) : ?>
< h3 > Hi Sally </ h3 >
<?php elseif ( $username === 'joe' ) : ?>
< h3 > Hi Joe </ h3 >
<?php else : ?>
< h3 > Hi unknown user </ h3 >
<?php endif ; ?>