作者:燁竹
學(xué)習(xí)起因:公司老是讓我做小需求,所以想學(xué)習(xí)一門較為輕量級的php框架,自己搭建的MVC框架老是出問題,所以在網(wǎng)上找了一段時間棒假,選擇CodeIgniter框架;
目錄結(jié)構(gòu)
myshop
|-----system 框架程序目錄
|-----core 框架的核心程序
|-----CodeIgniter.php 引導(dǎo)性文件
|-----Common.php 加載基類庫的公共函數(shù)
|-----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 輔助函數(shù)
|-----url_helper.php url相關(guān)的輔助函數(shù)精盅,如:創(chuàng)建url的輔助函數(shù)
|-----captcha_helper.php創(chuàng)建圖形驗(yàn)證碼的輔助函數(shù)
|-----libraries 通用類庫
|-----Pagination.php 通用分頁類庫
|-----Upload.php 通用文件上傳類庫
|-----Image_lib.php 通用圖像處理類庫
|-----Session.php 通用session類庫
|-----language 語言包
|-----database 數(shù)據(jù)庫操作相關(guān)的程序
|-----DB_active_rec.php 快捷操作類文件(ActiveRecord)
|-----fonts 字庫
|-----application 項(xiàng)目目錄
|-----core 項(xiàng)目的核心程序
|-----helpers 項(xiàng)目的輔助函數(shù)
|-----libraries 通用類庫
|-----language 語言包
|-----config 項(xiàng)目相關(guān)的配置
|-----config.php 項(xiàng)目相關(guān)的配置文件
|-----database.php 數(shù)據(jù)庫相關(guān)的配置文件
|-----autoload.php 設(shè)置自動加載類庫的配置文件
|-----constants.php 常量配置文件
|-----routes.php 路由配置文件
|-----controllers 控制器目錄
|-----welcome.php 控制器文件帽哑,繼承CI_Controller
|-----models 模型目錄
|-----welcome_model.php 模型文件,繼承CI_Model
|-----views 視圖目錄
|-----welcome.php 視圖模板文件叹俏,默認(rèn)后綴名為.php
|-----cache 存放數(shù)據(jù)或模板的緩存文件
|-----errors 錯誤提示模板
|-----hooks 鉤子妻枕,在不修改系統(tǒng)核心文件的基礎(chǔ)上擴(kuò)展系統(tǒng)功能
|-----third_party 第三方庫
|-----logs 日志
|-----index.php 入口文件
url
相關(guān)文件: .htaccess 文件 config/config.php
application/config.php
application/config/routes.php(:num) 匹配只含有數(shù)字的一段。 (:any) 匹配含有任意字符的一段粘驰;:any 會被轉(zhuǎn)換為 [^/]+ 屡谐, :num 會被轉(zhuǎn)換為 [0-9]+
$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
URL 的第一段是 "product" ,第二段是數(shù)字時蝌数,將重定向到 "catalog" 類的 "product_lookup_by_id" 方法愕掏,并將第二段的數(shù)字作為參數(shù)傳遞給它。
如果你使用逆向引用顶伞,你需要使用美元符號代替雙斜線語法
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>
控制器
相關(guān)文件: application/controllers/
application/config/routes.php 定義默認(rèn)控制器重映射方法:_remap()如果你的控制包含一個 _remap() 方法,那么無論 URI 中包含什么參數(shù)時都會調(diào)用該方法挠锥。 它允許你定義你自己的路由規(guī)則众羡,重寫默認(rèn)的使用 URI 中的分段來決定調(diào)用哪個方法這種行為
處理輸出:_output()如果你的控制器含有一個 _output() 方法侨赡,輸出類將會調(diào)用該方法來顯示數(shù)據(jù)蓖租, 而不是直接顯示數(shù)據(jù)。該方法的第一個參數(shù)包含了最終輸出的數(shù)據(jù)
私有方法:將方法聲明為 private 或 protected 并且在方法名前加上一個下劃線前綴也可以讓該方法無法訪問
請不要將你的控制器命名為這些:
CI_Controller
Default
index
函數(shù)
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
視圖
相關(guān)文件:application/views/
加載視圖
$this->load->view('name');
向視圖添加動態(tài)數(shù)據(jù)
通過視圖加載方法的第二個參數(shù)可以從控制器中動態(tài)的向視圖傳入數(shù)據(jù)羊壹, 這個參數(shù)可以是一個 數(shù)組 或者一個 對象
數(shù)組:
$data = array(
'title' => 'My Title',
'heading' => 'My Heading',
'message' => 'My Message'
);
$this->load->view('blogview', $data);
當(dāng)你使用對象時蓖宦,對象中的變量會轉(zhuǎn)換為數(shù)組元素
將視圖作為數(shù)據(jù)返回,默認(rèn)作為視圖返回
$string = $this->load->view('myfile', '', TRUE);
模型
相關(guān)文件:application/models/
加載并訪問模型
$this->load->model('models下面的模型方法位置',重命名油猫,是否自動連接數(shù)據(jù)庫/參數(shù)配置數(shù)據(jù)庫);
$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);
}
}
輔助函數(shù)
相關(guān)文件: system/helpers
application/helpers
application/config/config.php加載和使用輔助函數(shù)
$this->load->helper('name');
name可以是字符串和數(shù)組
$this->load->helper(
array('helper1', 'helper2', 'helper3')
);
CodeIgniter 類庫
相關(guān)文件:system/libraries/
application/config/config.php$this->load->library('class_name')
name可以是字符串和數(shù)組
創(chuàng)建自定義庫類
初始化類時傳入?yún)?shù)
在加載類庫的時候稠茂,你可以通過第二個參數(shù)動態(tài)的傳遞一個數(shù)組數(shù)據(jù),該數(shù)組將被傳到 你的類的構(gòu)造函數(shù)中:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('someclass', $params);
如果你使用了該功能,你必須在定義類的構(gòu)造函數(shù)時加上參數(shù):
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
public function __construct($params)
{
// Do something with $params
}
}
get_instance() 用來獲取CI 的全局超級對象睬关,CI 是單例模式的框架诱担,所有全局有一個超級對象。因?yàn)橹挥幸粋€實(shí)例电爹,所以無論這個函數(shù)使用多少次都不會消耗資源的蔫仙。一般來說,只有在helper或library中才使用get_instance
驅(qū)動器:
所在目錄:system/libraries/
驅(qū)動器是一種特殊類型的類庫丐箩,它有一個父類和任意多個子類摇邦。子類可以訪問父類, 但不能訪問兄弟類屎勘。在你的 控制器 中施籍,驅(qū)動器為你的類庫提供了 一種優(yōu)雅的語法,從而不用將它們拆成很多離散的類概漱。
核心系統(tǒng)類:
相關(guān)文件:application/core
application/config/config.php
system/compat/core/CodeIgniter每次 CodeIgniter 運(yùn)行時丑慎,都有一些基礎(chǔ)類伴隨著核心框架自動的被初始化。但你也可以使用你自己類來替代這些核心類或者擴(kuò)展這些核心類瓤摧。
大多數(shù)用戶一般不會有這種需求立哑,但對于那些想較大幅度的改變 CodeIgniter 的人來說,我們依然提供了替換和擴(kuò)展核心類的選擇
鉤子 - 擴(kuò)展框架核心
相關(guān)文件:application/config/config.php
application/config/hooks.phpCodeIgniter 的鉤子特性提供了一種方法來修改框架的內(nèi)部運(yùn)作流程姻灶,而無需修改 核心文件铛绰。CodeIgniter 的運(yùn)行遵循著一個特定的流程,你可以參考這個頁面的 應(yīng)用程序流程圖 产喉。但是捂掰,有些時候你可能希望在 執(zhí)行流程中的某些階段添加一些動作,例如在控制器加載之前或之后執(zhí)行一段腳本曾沈, 或者在其他的某些位置觸發(fā)你的腳本
自動加載資源
相關(guān)文件:application/config/autoload.php
application/config/config.phpCodeIgniter 的"自動加載"特性可以允許系統(tǒng)每次運(yùn)行時自動初始化類庫这嚣、輔助函數(shù)和模型。 如果你需要在整個應(yīng)用程序中全局使用某些資源塞俱,為方便起見可以考慮自動加載它們
公共函數(shù)
is_php($version):判斷當(dāng)前運(yùn)行的 PHP 版本是否高于或等于你提供的版本
is_really_writable($file):判斷是否可寫
config_item($key):訪問單個配置項(xiàng)
set_status_header($code[, $text = '']):用于手動設(shè)置服務(wù)器的 HTTP 狀態(tài)碼
remove_invisible_characters($str[, $url_encoded = TRUE]):防止在 ASCII 字符串中插入空字符姐帚,
html_escape($var)
可以接受字符串參數(shù)外,還可以接受數(shù)組參數(shù)障涯。
它在防止 XSS 攻擊時很有用罐旗。
get_mimes():返回 application/config/mimes.php 文件中定義的 MIME 數(shù)組的 引用
is_https():判斷是否是https
is_cli():
該函數(shù)會檢查 PHP_SAPI 的值是否是 'cli' ,或者是否定義了 STDIN 常量唯蝶。
function_usable($function_name)
檢查一個函數(shù)是否可用九秀,可用返回 TRUE ,否則返回 FALSE
兼容性函數(shù)
哈希相關(guān):
password_get_info — 返回指定散列(hash)的相關(guān)信息password_hash — 創(chuàng)建密碼的散列(hash)
password_needs_rehash — 檢測散列值是否匹配指定的選項(xiàng)
password_verify — 驗(yàn)證密碼是否和散列值匹配
hash_equals — 可防止時序攻擊的字符串比較
hash_pbkdf2 — 生成所提供密碼的 PBKDF2 密鑰導(dǎo)出
錯誤處理
相關(guān)文件:index.php
config/constants.php相關(guān)函數(shù)
生成錯誤信息:
show_error($message, $status_code, $heading = 'An Error Was Encountered')
show_404($page = '', $log_error = TRUE)找不到的文件路徑
log_message($level, $message)向你的日志文件中寫入信息
網(wǎng)頁緩存
相關(guān)目錄:application/cache緩存文件
開啟緩存
$this->output->cache($n);$n表示緩存更新時間單位分鐘
如果你需要手工刪除緩存粘我,你可以使用 delete_cache() 方法
$this->output->delete_cache('/foo/bar');
程序分析
相關(guān)文件:application/config/profiler.php
分析器類會在頁面下方顯示基準(zhǔn)測試結(jié)果鼓蜒,運(yùn)行過的 SQL 語句, 以及 $_POST 數(shù)據(jù)。這些信息有助于開發(fā)過程中的調(diào)試和優(yōu)化
啟用分析器 $this->output->enable_profiler(TRUE);
禁用分析器 $this->output->enable_profiler(FALSE);
以 CLI(命令行) 方式運(yùn)行
使用命令行的情況
使用 cron 定時運(yùn)行任務(wù)都弹,而不需要使用 wget 或 curl
通過函數(shù) is_cli() 的返回值來讓你的 cron 頁面不能通過 URL 訪問到
制作交互式的任務(wù)娇豫,例如:設(shè)置權(quán)限,清除緩存畅厢,備份等等與其他語言進(jìn)行集成锤躁,例如可以通過 C++ 調(diào)用一條指令來運(yùn)行你模型中的代碼
應(yīng)用程序(模塊)
相關(guān)文件:index.php
$application_folder = 'application';
多環(huán)境處理
相關(guān)文件: index.php $_SERVER['CI_ENV']
.htaccess如果將 ENVIRONMENT 常量設(shè)置為 'development' ,當(dāng)發(fā)生 PHP 錯誤時錯誤信息會顯示到瀏覽器上或详。與之相對的系羞,如果將常量設(shè)置為 'production' 錯誤輸出則會被禁用
在視圖文件中使用 PHP 替代語法
相關(guān)文件:config/config.php
Echo 替代語法
<? php echo $variable ; ?>
可以寫成
<?= $variable ?>
控制結(jié)構(gòu)的替代語法(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 ; ?>