CI 學習筆記、記錄

【ci框架】ci框架目錄結構分析

分類: CodeIgniter深刻研究】2013-05-09 00:24 7420人閱讀 評論(5) 收藏 舉報javascript

[php] view plaincopyphp

  1. myshop  
  2. |-----system                框架程序目錄  
  3. |-----core          框架的核心程序  
  4. |-----CodeIgniter.php   引導性文件  
  5. |-----Common.php    加載基類庫的公共函數  
  6. |-----Controller.php    基控制器類文件:CI_Controller  
  7. |-----Model.php     基模型類文件:CI_Model  
  8. |-----Config.php    配置類文件:CI_Config  
  9. |-----Input.php     輸入類文件:CI_Input  
  10. |-----Output.php    輸出類文件:CI_Output  
  11. |-----URL.php       URL類文件:CI_URl  
  12. |-----Router.php    路由類文件:CI_Router  
  13. |-----Loader.php    加載類文件:CI_Loader  
  14. |-----helpers           輔助函數  
  15. |-----url_helper.php    url相關的輔助函數,如:建立url的輔助函數  
  16. |-----captcha_helper.php建立圖形驗證碼的輔助函數  
  17. |-----libraries         通用類庫  
  18. |-----Pagination.php    通用分頁類庫  
  19. |-----Upload.php    通用文件上傳類庫  
  20. |-----Image_lib.php 通用圖像處理類庫  
  21. |-----Session.php   通用session類庫  
  22. |-----language          語言包  
  23. |-----database          數據庫操做相關的程序  
  24. |-----DB_active_rec.php 快捷操做類文件(ActiveRecord)  
  25. |-----fonts         字庫  
  26. |-----application           項目目錄  
  27. |-----core          項目的核心程序  
  28. |-----helpers           項目的輔助函數  
  29. |-----libraries         通用類庫  
  30. |-----language          語言包  
  31. |-----config            項目相關的配置  
  32. |-----config.php    項目相關的配置文件     
  33. |-----database.php  數據庫相關的配置文件  
  34. |-----autoload.php  設置自動加載類庫的配置文件  
  35. |-----constants.php 常量配置文件  
  36. |-----routes.php    路由配置文件  
  37. |-----controllers       控制器目錄  
  38. |-----welcome.php   控制器文件,繼承CI_Controller  
  39. |-----models            模型目錄  
  40. |-----welcome_model.php 模型文件,繼承CI_Model  
  41. |-----views         視圖目錄  
  42. |-----welcome.php   視圖模板文件,默認後綴名爲.php  
  43. |-----cache         存放數據或模板的緩存文件  
  44. |-----errors            錯誤提示模板  
  45. |-----hooks         鉤子,在不修改系統核心文件的基礎上擴展系統功能  
  46. |-----third_party       第三方庫  
  47. |-----logs          日誌  
  48. |-----index.php             入口文件  

 

 

 

 

base_url();根目錄地址
site_url();網址html

表單驗證類 使用java

public function index()
{
$this->load->helper(array('form', 'url'));mysql

$this->load->library('form_validation');//1.載入表單驗證類程序員

$this->form_validation->set_rules('username', 'Username', 'required');//設置驗證規則
$this->form_validation->set_rules('password', 'Password', 'required',
array('required' => 'You must provide a %s.')
);
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');web

if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
}正則表達式

 


舉例來講,若是你的 URI 是這樣的:sql

example.com/index.php/products/shoes/sandals/123

URI 的第3和第4部分會被傳遞給你的方法(「sandals」 和 「123」):數據庫

<?php
class Products extends CI_Controller {

public function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}
?>

上面的方法調用時必須給兩個相應的參數,要否則會出錯。固然你也能夠像下面這樣寫,就不用在調用的時候給參數了!

<?php
class Products extends CI_Controller {

public function shoes($sandals='Test', $id=1)
{
echo $sandals;
echo $id;
}
}

 


定義默認控制器
當你的網站沒有設置 URI 或者直接從根目錄訪問的時候,CodeIgniter 會加載默認控制器。打開 application/config/routes.php 文件來設置默認控制器:

$route['default_controller'] = 'Blog'

?>

 

處理輸出
CodeIgniter 擁有一個輸出類用來確保你修改的數據會自動被傳遞給瀏覽器。關於這個的更多信息能夠在視圖和輸出類裏找到。有些時候,你可能想要本身發佈修改一些最終的數據或是本身把它傳遞給瀏覽器。CodeIgniter 容許你給你的控制器增長一個名爲 _output() 的方法來接收最終的數據。

注意: 若是你的控制器包含一個 _output() 方法,那麼它將老是被調用,而不是直接輸出最終的數據。這個方法相似於OO裏的析構函數,無論你調用任何方法這個方法老是會被執行。

例如:

public function _output($output)
{
echo $output;
}

請注意,你的 _output() 將接收最終的數據。 Benchmark和內存的使用率數據將被渲染,緩存文件會被寫入(若是已啓用緩存),而且 HTTP 頭也將被髮送(若是您使用該功能),而後交給 _output() 函數。

爲了讓你的控制器輸出緩存正確, 它的 _output() 函數能夠這樣來寫:

if ($this->output->cache_expiration > 0)
{
$this->output->_write_cache($output);
}
若是您正在使用頁面執行時間和內存使用統計的功能,這可能不徹底準確,由於他們不會考慮到你所作的任何進一步的動做。請在輸出類參用可用的方法,來控制輸出以使其在任何最終進程完成以前執行。

 

私有方法
在某些狀況下,你可能想要隱藏一些方法使之沒法對外查閱。將方法私有化很簡單,只要在方法名字前面加一個下劃線(「_」)作前綴就沒法經過 URL 訪問到了。例如,若是你有一個像這樣的方法:

private function _utility()
{
// some code
}

那麼,經過下面這樣的 URL 進行訪問是沒法訪問到的:

example.com/index.php/blog/_utility/

 


如何將控制器放入子文件夾中
若是你在創建一個大型的應用程序,你會發現 CodeIgniter 能夠很方便的將控制器放到一些子文件夾中。

只要在 application/controllers 目錄下建立文件夾並放入你的控制器就能夠了。

注意: 若是你要使用某個子文件夾下的功能,就要保證 URI 的第一個片斷是用於描述這個文件夾的。例如說你有一個控制器在這裏:

application/controllers/products/shoes.php

調用這個控制器的時候你的 URI 要這麼寫:

example.com/index.php/products/shoes/show/123

你的每一個子文件夾中須要包含一個默認的控制器,這樣若是 URI 中只有子文件夾而沒有具體功能的時候它將被調用。只要將你做爲默認的控制器名稱在 application/config/routes.php 文件中指定就能夠了。

CodeIgniter 也容許你使用 URI 路由 功能來從新定向 URI。

 


構造函數
若是要在你的任意控制器中使用構造函數的話,那麼必須在裏面加入下面這行代碼:

parent::__construct();

這行代碼的必要性在於,你此處的構造函數會覆蓋掉這個父控制器類中的構造函數,因此咱們要手動調用它。

<?php
class Blog extends CI_Controller {

public function __construct()
{
parent::__construct();
}
}
?>

若是你須要設定某些默認的值或是在實例化類的時候運行一個默認的程序,那麼構造函數在這方面就很是有用了。
構造函數並不能返回值,可是能夠用來設置一些默認的功能。

 

 


視圖
簡而言之,一個視圖就是一個網頁,或是網頁的部分,如頭部,底部,側邊欄等等。事實上,若是你須要這種層次類型,視圖能夠很靈活的嵌入到其餘視圖中。

視圖從不直接調用,必須被一個控制器來調用。記住,在一個 MVC 框架中,控制器扮演着交通警察的角色,那麼,他有責任去取回某一特定的視圖。若是你尚未閱讀過控制器頁面的話,你應該事先閱讀控制器頁面。


載入視圖 $this->load->view('name');
子文件夾裏面的視圖
$this->load->view('folder_name/file_name');

zai載入多個視圖
若是有多個調用,那麼他們將會被合併到一塊兒。例如,你可能但願有一個標題視圖、一個菜單視圖、一個內容視圖、和一個頁腳視圖。他們看起來應該是這樣:

$data['page_title'] = 'Your title';
$this->load->view('header',$data);
$this->load->view('menu');
$this->load->view('content');
$this->load->view('footer');
咱們一次性載入多個視圖的時候,你只需在第一個視圖傳入數據就能夠了(header視圖顯示title,content視圖顯示message),好比:


建立循環
$todo_list 是傳過來的數據
<ul>
<?php foreach ($todo_list as $item):?>

<li><?php echo $item;?></li>

<?php endforeach;?>
</ul>

 

 


獲取視圖內容
view函數第三個可選參數能夠改變函數的行爲,讓數據做爲字符串返回而不是發送到瀏覽器。若是想用其它方式對數據進一步處理,這樣作頗有用。若是將view第三個參數設置爲true(布爾)則函數返回數據。view函數缺省行爲是 false, 將數據發送到瀏覽器。若是想返回數據,記得將它賦到一個變量中:

$string = $this->load->view('myfile', '', true);

view方法中的第三個參數表示不輸出視圖,而只是將結果返回給一個變量。


active record

 

模型
文件名應該是模型類名的小寫版。好比,若是你的類是:

class User_model extends CI_Model {

function __construct()
{
parent::__construct();
}
}

類的文件名應該是:

application/models/user_model.php

 

載入模型
模型能夠在 控制器 中被引用。就像這樣:

$this->load->model('Model_name');

若是模型文件在子文件夾下,引用的時候要帶上相對路徑名。例如:若是你有一個模型 application/models/blog/queries.php。下面的代碼能夠引用它:

$this->load->model('blog/queries');

模型一旦被載入,你就能經過下面的方法使用它:

$this->load->model('Model_name');

$this->Model_name->function();

在默認的狀況下模型名稱就直接被引入做爲對象名,就如上面所示。固然,若是你願意,能夠起個更好記的對象名!那麼,能夠在加載模型函數中指定第二個參數來設定,例如:

$this->load->model('Model_name', 'fubar');

$this->fubar->function();

 

 

自動載入模型實現的方法是打開 application/config/autoload.php 文件,而後在自動裝載數組中添加上這個模型。


連接數據庫
您能夠把 第三個參數 設置爲TRUE來使模型裝載函數自動鏈接數據庫,鏈接配置能夠在您的數據庫配置文件中能夠定義:
$this->load->model('Model_name', '', TRUE);

您能夠手動設定第三個參數來載入您的自定義數據庫配置:
$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

$this->load->model('Model_name', '', $config);

 

輔助函數
URL Helpers 能夠幫助咱們建立連接,Form Helpers 能夠幫助咱們建立表單,Text Helpers 提供一系列的格式化輸出方式,Cookie Helpers 能幫助咱們設置和讀取COOKIE, File Helpers 能幫助咱們處理文件,等等。

CodeIgniter 默認是沒有載入輔助函數文件的,因此若是你想用輔助函數,就必須先載入它。一旦被載入,輔助函數將全局可用(globally available),你能夠在 controller 和 views 中使用它們。

就近原則
輔助函數文件通常保存在 system/helpers 或 application/helpers 文件夾中。CodeIgniter 將會先在 application/helpers 尋找對應的輔助函數文件,若是目錄不存在或者目錄下沒有對應的輔助函數文件,CI 纔會載入 system/helpers 下的輔助函數文件。

載入輔助函數是很是簡單的:

單個載入
$this->load->helper('name');
多個載入

$this->load->helper( array('helper1', 'helper2', 'helper3') );

自動載入
經過打開 application/config/autoload.php ,並往自動載入數組(autoload array)中增長輔助函數來實現。


name 是輔助函數文件的名字(不帶.php後綴 和"helper" 部分)。輔助函數載入函數並不返回值,因此不要嘗試將它付給一個變量

使用::
使用輔助函數
一旦你載入了想要用到輔助函數文件,你就能夠用標準的函數調用方法來使用裏面的函數。

例如,要使用anchor() 函數來創建一個連接,在視圖(View)文件裏面你能夠這樣作:

<?php echo anchor('blog/comments', 'Click Here');?>

 

擴展輔助函數
"擴展" Helpers
你若是想 "擴展"一個原有的 Helpers,,能夠在你的 application/helpers/ 目錄下建立一個新的helper,新的helper的名字是在被「擴展」的Helper的名字開頭多加一個 MY_ (這是能夠配置的. 見下.).

若是你想作的只是在原有的helper中添加一些新的功能,好比,添加一兩個新的方法,或者是修改一個方法;就不值得重寫本身的helper。在這種狀況下,最好是「擴展」已有的helper。「擴展」一詞用在這裏不是很恰當,由於Helper的方法是程序化(procedural) 和離散(discrete)的,在傳統的語言環境中沒法被「擴展」,不過在CodeIgniter中,你能夠添加或修改helper的方法。

例如,擴展一個本地已有的 Array Helper 你應該創建一個文件: application/helpers/MY_array_helper.php, 並添加或重寫(override)其中的一些方法:

// any_in_array() is not in the Array Helper, so it defines a new function
function any_in_array($needle, $haystack)
{
$needle = (is_array($needle)) ? $needle : array($needle);

foreach ($needle as $item)
{
if (in_array($item, $haystack))
{
return TRUE;
}
}

return FALSE;
}

// random_element() is included in Array Helper, so it overrides the native function
function random_element($array)
{
shuffle($array);
return array_pop($array);
}

設定你本身的前綴(Prefix)
用於"擴展" helper 而加上前綴的文件一樣也是對庫和核心類的擴展.爲了設置你自定義的前綴,請打開 application/config/config.php 文件,而後找到以下的條目:

$config['subclass_prefix'] = 'MY_';

請注意:因爲全部CodeIgniter自帶的庫都被冠以 CI_ 這樣的前綴命名,因此請不要使用CI_來自定義前綴.

 

 

 

 

使用 CodeIgniter 類庫
全部的類庫文件存放在system/libraries 文件夾。大多數狀況下你須要預先在controller中初始化後才能使用它們:

$this->load->library('class name');


多個類庫能夠經過傳遞包含類庫的數組一次加載。

$this->load->library(array('email', 'table'));

例如$this->load->library('form_validation');


創建你的類庫文件
你的類庫文件必須保存在 application/libraries 文件夾,CodeIgniter將在這個文件夾中尋找並初始化它們.

命名約定
文件名首字母大寫. 例如: Myclass.php
類聲明首字母大寫. 例如: class Myclass
類的名字和文件名應符合.
類文件
全部的類應有基礎原型(注意,這裏咱們以 Someclass 這個名字爲例):

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

public function some_function()
{
}
}

/* End of file Someclass.php */

使用你本身的類
在全部的Controller 函數中,你能夠用如下的標準方式初始化你的類:

$this->load->library('someclass');

當 someclass 是文件名時,不用加上".php"擴展名.這裏名字不分大小寫.

一旦你自定義的類加載完畢,你能夠經過如下方式調用類,注意使用 小寫 的名字:

$this->someclass->some_function(); // 對象的實例名永遠都是小寫的

 


在初始化自定義類時傳遞參數
當初始化類庫時,你能夠經過第二個參數動態的傳遞數組到類的構造函數中去:

$params = array('type' => 'large', 'color' => 'red');

$this->load->library('Someclass', $params);

當你使用這個特性時,你必須爲類的構造函數加上參數:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

public function __construct($params)
{
// Do something with $params
}
}

?>

 


在你自定義的類庫中初始化CodeIgniter資源,必須使用 get_instance() 函數.

 

通常來講在你的控制器函數中你能夠經過 $this 調用任何可用的CodeIgniter函數:

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
//etc.
$this, 只直接做用在你本身的控制器,模型和視圖中.當你在自定義類中想使用CodeIgniter原始類時,你能夠這樣作:

首先,定義CodeIgniter對象賦給一個變量:

$CI =& get_instance();

一旦定義某個對象爲一個變量,你就可使用那個變量名 取代 $this:

$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
//etc.
注意: 你將注意到get_instance()這個函數經過被引用的方式被傳遞:

$CI =& get_instance();

這十分重要. 經過引用的方式賦給變量將使用原始的 CodeIgniter 對象,而不是建立一個副本。

 

 

擴展的類必須申明由母類擴展而來.
新擴展的類所在的文件必須以 MY_ 爲前綴(這個選項是可配置的,下面有說明).
例如,要擴展原始類 Email 類你要創建文件 application/libraries/MY_Email.php, 並按以下方式在文件中聲明:

class MY_Email extends CI_Email {

}

注意:若是你須要在類中使用構造函數,你必須在構造函數中顯式繼承母類構造函數:

class MY_Email extends CI_Email {

public function __construct()
{
parent::__construct();
}
}

載入你的子類
要載入擴展子類,你應該使用標準字符名. 請不要使用前綴. 例如,要載入上文說過的email擴展子類,你應該這樣寫:

$this->load->library('email');
\
擴展子類一旦被載入,就能像通常的類同樣使用它們. Email類中的全部函數就能被調用:

$this->email->some_function();

 

 

 

 

 

 

 

 

使用 CodeIgniter 適配器
適配器的源文件存放在system/libraries 目錄下, 在本身的文件夾同樣有和父類名字相同的類庫可使用 同時在這個文件夾中,有一個子文件夾叫作 drivers在其中包含了全部的子類

要使用一個適配器,你須要在一個控制器裏用以下的初始化函數初始它:

$this->load->driver('class name');
這裏的class name 是你想加載的適配器的名字。 好比說你想加載一個叫作"Some Parent"的適配器,你能夠這樣:

$this->load->driver('some_parent');

控制器類中的方法能夠用以下的方式來調用:

$this->some_parent->some_method();

這些做爲子類的適配器能直接經過父類調用,而不用初始化。

$this->some_parent->child_one->some_method();
$this->some_parent->child_two->another_method();


建立適配器
適配器目錄和文件結構
適配器目錄和文件結構佈局的例子:

/application/libraries/Driver_name
Driver_name.php
drivers
Driver_name_subclass_1.php
Driver_name_subclass_2.php
Driver_name_subclass_3.php
這個 Driver_name 目錄必須使用 ucfirst() 函數處理。

 

 


);

 

 

 

 

 

 

 

 


鉤子 - 擴展框架的核心
CodeIgniter 的鉤子功能使得您能夠在不修改系統核心文件的基礎上來改變或增長系統的核心運行功能。 當 CodeIgniter 運行後,它會產生出一個特殊的進程,這個進程在 項目流程 頁面中有說明。 固然,您能夠自定義一些動做來替代程序運行過程當中的某些階段。例如,您能夠在控制器剛剛載入前或剛剛載入後來運行特定的腳本,或者在其餘時刻來觸發您的腳本。

啓用鉤子
鉤子功能能夠在全局範圍內打開或關閉,您能夠在 application/config/config.php 文件中設定:

$config['enable_hooks'] = TRUE;

定義鉤子
鉤子是在 application/config/hooks.php 文件中定義的。 每一個鉤子能夠用如下格式的數組來定義:

$hook['pre_controller'] = array(
'class' => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);

說明:
數組的索引與你使用的指定掛鉤點名字相關.上面的例子中掛鉤點是pre_controller. 掛鉤點參數列表以下所示. 如下各項將定義在你的相關鉤子數組裏:

class 你但願調用的類名.若是你更喜歡使用過程函數代替類的話,此項保留爲空.
function 你但願調用的函數名.
filename 包含有你的類/函數的文件名.
filepath 包含你的腳本的目錄名. 注意: 你的腳本放在 application 文件夾下的目錄裏, 這樣 filepath就以那個文件夾(application)爲基準. 例如, 若是你的腳本放在application/hooks下, 你能夠把hooks 做爲你的filepath. 若是你的腳本放在application/hooks/utilities下你能夠把 hooks/utilities做爲filepath. 注意後面沒有"/".若是不放在根目錄下能夠根據相對路徑的配置,來完成調用。這樣就能夠完成,多個應用共享一個鉤子。
params 你但願傳遞給腳本的任何參數. 此項是可選的.
同一掛鉤點的屢次引用
若是你想在同一個掛鉤點引用多個腳本,最簡單的方式就是把你的數組定義成二維的,像這樣:

$hook['pre_controller'][] = array(
'class' => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);

$hook['pre_controller'][] = array(
'class' => 'MyOtherClass',
'function' => 'MyOtherfunction',
'filename' => 'Myotherclass.php',
'filepath' => 'hooks',
'params' => array('red', 'yellow', 'blue')
);

注意在每一個數組索引後面的中括號:

$hook['pre_controller'][]

這容許你的多個腳本擁有相同的掛鉤點。你定義數組的順序將是程序執行的順序.

 

 

 

 

 


掛勾點
如下是一組可用的掛鉤點.

pre_system
系統執行的早期調用.僅僅在benchmark 和 hooks 類 加載完畢的時候. 沒有執行路由或者其它的過程.
pre_controller
在調用你的任何控制器以前調用.此時所用的基礎類,路由選擇和安全性檢查都已完成.
post_controller_constructor
在你的控制器實例化以後,任何方法調用以前調用.
post_controller
在你的控制器徹底運行以後調用.
display_override
覆蓋_display()函數, 用來在系統執行末尾向web瀏覽器發送最終頁面.這容許你用本身的方法來顯示.注意,你須要經過 $this->CI =& get_instance() 引用 CI 超級對象,而後這樣的最終數據能夠經過調用 $this->CI->output->get_output() 來得到。
cache_override
可讓你調用本身的函數來取代output類中的_display_cache() 函數.這可讓你使用本身的緩存顯示方法
post_system
在最終着色頁面發送到瀏覽器以後,瀏覽器接收完最終數據的系統執行末尾調用

 


自動裝載資源
「libraries」文件夾中的核心類
「helper」文件夾中的輔助函數
「config」文件夾中自定義配置文件
「system/language」文件夾中的語言包
「models」文件夾中的模型
要自動裝載資源,打開 application/config/autoload.php 文件,而後將你想要自動裝載的項目添加到 autoload 數組中,你會發現該文件中對應於上面每一個項目類型指示。

 

 

 

 

公共函數
注:本條爲本人添加。公共函數位於 system/core/Common.php 文件中,你們能夠在這裏定義本身的公共函數。--IT不倒翁

CodeIgniter 使用了一些全局定義的函數來完成操做,在任何狀況下你都可以使用這些函數。使用他們不須要載入任何類庫或輔助函數。

eg:
show_error('message'), show_404('page'), log_message('level', 'message')

set_status_header(code, 'text');
容許你手動設置服務器狀態頭(header)。例如:

set_status_header(401);

// 將header設置爲: Unauthorized

 


html_escape($mixed)
利用此功能能夠方便的使用htmlspecialchars()函數。它接受字符串和數組。有助於防止跨站腳本攻擊(XSS)。

 

 

 

 

 

 

 

 


URI 路由
example.com/class/function/id/

 

設定你本身的路由規則
路由規則定義在application/config/routes.php 文件中. 在此文件中,你能夠看到一個名爲 $route的數組,它可讓你定義你本身的路由規則。 定義能夠用兩種方式: 通配符(wildcards) 或者 正則表達式(Regular Expressions)

 

通配符
一個典型的通配符路由看起來是這樣的:

$route['product/(:num)'] = "catalog/product_lookup";

在一個路由中,數組的鍵包含着被匹配的URI,而數組的值包含着路由將被重定向的目的地.在上面的例子中,若是單詞「product」出如今URL的第一個部分中,並且數字(:num)出如今URI的第二個部分中,"catalog"類和"product_lookup"方法將被替代使用(即將被重定向).

你能夠匹配文字的值或者使用如下兩種通配符類型:

:num 將匹配一個只包含有數字的segment(段).
:any 將匹配一個包含任何字符的segment.

注意: 路由將會按照定義的順序來運行.高層的路由老是優先於低層的路由.
$route['journals'] = "blogs";

若是URL的第一個分段(類名)是關鍵字"journals",那麼將會重定向到"blogs"類中處理.

$route['blog/joe'] = "blogs/users/34";

若是URL的前兩個分段是"blog"和"joe",那麼將會重定向到"blogs"類的"users"方法中處理.而且將ID"34"設爲參數.

$route['product/(:any)'] = "catalog/product_lookup";

當"product"做爲URL中第一個分段時, 不管第二分段是什麼都將被重定向到"catalog"類的"product_lookup"方法.

$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";

當「product」做爲 URL 中第一個分段時,若是第二分段是數字,則將被重定向到「catalog」類,並傳遞所匹配的內容到「product_lookup_by_id」方法中。


一個典型的正則表達式看起來像下面的樣子:

$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";

上例中, 相似於 products/shirts/123 的URI 將換成調用 shirts 控制器類的 id_123 方法.

 


系統保留的路由
系統會保留兩個路由:

第一個爲系統默認的路由:

$route['default_controller'] = 'welcome';

這個路由代表了當URI中不包含要訪問的類和控制器信息的(即只訪問根目錄的狀況,如http://localhost/ci)將要加載哪一個控制器。上例中,系統將加載 "welcome" 這個類(控制器)。你應該保證設置一個默認路由,否則你的首頁將會顯示 404 錯誤。

第二個爲404頁面的路由:

$route['404_override'] = '';

這個路由標識了若是請求的控制器沒法訪問的時候將加載哪一個控制器。它至關於覆蓋了默認的404錯誤頁面(即提供了本身定義404頁面的功能)。但它不會影響show_404()這個方法,這個方法依然會加載默認的位於application/errors/error_404.php的error_404.php頁面。

 

 

錯誤處理
show_error('消息' [, int $status_code = 500 ] [, string $heading = 'An Error Was Encountered'])
這個函數將會使用如下錯誤模版來顯示錯誤消息:

application/errors/error_general.php

可選參數 $status_code 決定在顯示錯誤的同時將會發送哪一種 HTTP 狀態代碼。

可選參數 $heading 決定錯誤模版h1標籤內容。

show_404('頁面' [, 'log_error'])
這個函數將會使用如下錯誤模版來顯示 404 錯誤信息:

application/errors/error_404.php

傳遞給該函數的字符串表明的是找不到的文件路徑。注意CodeIgniter會在找不到目標控制器狀況下,自動顯示404消息。

CodeIgniter自動記錄任何 show_404() 函數調用。設置第二個可選的參數爲FALSE將跳過記錄

log_message('級別', '消息')
這個函數可讓你將消息寫入記錄文件中。你必須在第一個參數中選擇三個「級別「中的任何一個, 指明它是那一類消息(調試 debug, 錯誤 error, 信息info)。 第二個參數是消息自己。 例如:

if ($some_var == "")
{
log_message('error', 'Some variable did not contain a value.');
}
else
{
log_message('debug', 'Some variable was correctly set');
}

log_message('info', 'The purpose of some variable is to provide some value.');

有三種不一樣類型的消息:

錯誤類型的消息。 這種是真正的錯誤消息. 例如PHP錯誤或者用戶錯誤。
調試類型的消息。 這種是用來幫助調試的消息。 例如, 若是當一個類被初始化時,你能夠將這個初始化紀錄下來,而後用於調試。
信息類型的消息。 這種是最低優先級別的消息,它只是簡單的提供了關於運行的一些信息。 CodeIgniter 不會自動產生任何信息類型的消息,可是你可能會在你的程序裏使用它

意: 確保"logs" 文件夾是可寫的,才能準確地將消息寫入記錄文件中。此外, 你必須設置application/config/config.php文件中的"threshold"設定,經過設置「threshold「,你能夠只記錄錯誤類型的消息,而不用記錄其餘兩種。若是你將「threshold「設爲0,記錄就會被禁止。

 

網頁緩存

CI支持每一個頁面單獨緩存,並且能夠設置緩存更新時間。當一個網頁第一次被加載的時候,緩存文件將被保存到application/cache文件夾。下次訪問的時候,系統就會直接讀取緩存文件,而後返回給用戶的瀏覽器。若是緩存文件過時,它將被刪除並從新生成。


啓動緩存
啓用緩存功能,只須要將下面的代碼放入你的任何一個控制器(controller)的方法(function)內:

$this->output->cache(n);
若是你再也不想使用緩存,僅需將上面的代碼從你的controller裏面刪除便可


調試你的應用程序

激活分析器
$this->output->enable_profiler(TRUE);
分析器激活後將產生一個報告並插入您的頁面底部

使用如下方法禁用該分析器:

$this->output->enable_profiler(FALSE);


啓用和禁用分析數據中的字段
分析數據中的每一個字段可經過設置相應的控制變量TRUE or FALSE來啓用和禁用. 其中的一個方法是:你能夠在application/config/profiler.php 配置文件裏設置整個程序的全局默認值.

$config['config'] = FALSE;
$config['queries'] = FALSE;

另外一種方法是:你能夠在控制器中經過調用set_profiler_sections() 來覆蓋全局設置和默認設置,詳細可見: Output class:

$sections = array(
'config' => TRUE,
'queries' => TRUE
);

$this->output->set_profiler_sections($sections);

 


管理你的應用程序
若是你要對 application 進行重命名, 你須要打開 index.php 文件,對變量 $application_folder 進行更改:

$application_folder = "application";

更改你的應用程序的文件夾路徑
你能夠將 application文件夾從system 文件夾中挪放到服務器的其餘的位置。可是你還要更改 index.php 文件裏將$application_folder變量設置爲服務器的全路徑。

$application_folder = "/Path/to/your/application";

在一個 CodeIgniter 下運行多個應用程序
若是你想要多個應用程序共享同一個 CodeIgniter, 你要將 application 下全部的文件夾放在不一樣的應用程序的文件夾內。

例如,你要創建兩個應用程序 "foo" 和 "bar",你的應用程序文件夾的結構可能會像下面的這樣:

applications/foo/
applications/foo/config/
applications/foo/controllers/
applications/foo/errors/
applications/foo/libraries/
applications/foo/models/
applications/foo/views/
applications/bar/
applications/bar/config/
applications/bar/controllers/
applications/bar/errors/
applications/bar/libraries/
applications/bar/models/
applications/bar/views/

要選擇使用某個應用程序,你須要打開主 index.php 文件,而且設置 $application_folder 變量爲目標路徑。例如,經過以下設置,就能夠選擇使用 "foo" 應用程序:

$application_folder = "applications/foo";

 

 

 

 

 

 

 

 

 

 

 

 

 

 


視圖文件的 PHP 替代語法
若是你不使用 CodeIgniter 的模板引擎,則你能夠在視圖文件中使用原始 PHP 代碼。要使 PHP 代碼達到最精簡併使其更容易辨認,所以建議你使用 PHP 替代語法控制結構及短標記的 echo 語句。 建議你使用 PHP 的語法爲你的控制結構和簡短的輸出標籤。若是你還不熟悉這個語法,下面你將學會如何從代碼中消滅大括號和「echo」語句。

 


替代 Echo
正常的 echo 和 print 輸出通常是這樣的形式:

<?php echo $variable; ?>

使用替代語法,你能改爲這樣的形式:

<?=$variable?>

替代控制結構
控制結構,像 if,for,foreach,和 while 也能夠寫成簡化的形式。這裏是一個用 foreach 的例子:

<ul>

<?php foreach ($todo as $item): ?>

<li><?=$item?></li>

<?php endforeach; ?>

</ul>

注意,這裏沒有大括號。相反,結束大括號被替換成了 endforeach。上面列出的每個控制結構也有類似的關閉語法:endif,endfor,endforeach,和 endwhile

而且在每一個結構之後注意不要使用分號(除了最後一個),用冒號。這是很重要的!

這有另外一個例子,使用 if/elseif/else。注意冒號:

<?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; ?>

 


安全
本頁描述了一些關於 Web 安全的「最佳實踐」,並詳細說明了 CodeIgniter 的內部安全特性。

URI 安全
CodeIgniter 嚴格限制 URI 中所能包含的字符,以此幫助你設計的程序減小被惡意數據入侵的可能。URI 通常只包含下列內容:

字母和數字(Alpha-numeric text)
波浪符(Tilde): ~
句號(Period): .
冒號(Colon): :
下劃線(Underscore): _
破折號(Dash): -
Register_globals
系統初始化期間全部的全局變量都被 unset,除了那些在 $_GET、$_POST 和 $_COOKIE 數組中的數據。實際上 unsetting 實例程序的做用與register_globals = off 相同。

error_reporting
在生產環境中,每每有必要經過設置內部的error_reporting值爲0來禁用PHP錯誤報告。 這能夠防止可能含有敏感信息的原始PHP錯誤報告輸出。

在 index.php 設置CodeIgniter的 ENVIRONMENT 常量爲 'production' 將會關閉這些錯誤(報告)。在開發模式下,推薦設爲 'development'。 更多關於各環境間區別的信息能夠在處理多環境一章找到。

magic_quotes_runtime
在系統初始化期間 magic_quotes_runtime 指令被關閉以便在數據庫檢索數據時沒必要去掉反斜線。

最佳實踐
在接收任何數據到你的程序以前,無論是表單提交的 POST 數據、COOKIE 數據、URI 數據、XML-RPC 數據、仍是 SERVER 數組中的數據,咱們都推薦你實踐下面的三個步驟:

過濾不良數據.
驗證數據以確保符合正確的類型, 長度, 大小等. (有時這一步驟也可取代第一步驟)
在提交數據到你的數據庫以前將其轉換.
CodeIgniter 提供了下列函數以輔助這個過程:

XSS 過濾
CodeIgniter帶有一個跨站腳本過濾器. 這個過濾器會查找那些用一般手段嵌入到你數據中惡意的Javascript,或其它一些試圖欺騙cookie類型的或者作其它惡意事情的代碼. XSS Filter的詳細描述在 這裏.

驗證數據
CodeIgniter 有一個表單驗證類用來幫助驗證、過濾和預處理數據。

插入數據庫以前轉義全部數據
不要插入未轉義的信息到你的數據庫中。要了解更多信息請參閱查詢章節。

 

 


開發規範:*****************************


文件格式
文件應該使用 Unicode (UTF-8) 編碼保存。同時不要使用 字節序標記(BOM) 。

尾標籤
全部的php文件應該省略這個php閉合標籤,並插入一段註釋來標明這是文件的底部並定位這個文件在這個應用的相對路徑。這樣有利於你肯定這個文件已經結束而不是被刪節的。

不當的: <?php echo "Here's my code!"; ?> 適當的: <?php echo "Here's my code!"; /* End of file myfile.php */ /* Location: ./system/modules/mymodule/myfile.php */

 

類和方法(函數)的命名規則
類名的首字母應該大寫。若是名稱由多個詞組成,詞之間要用下劃線分隔,不要使用駱駝命名法。類中全部其餘方法的名稱應該徹底小寫而且名稱能明確指明這個函數的用途,最好用動詞開頭。儘可能避免過長和冗餘的名稱
不當的: class superclass class SuperClass 適當的: class Super_class

方法:
不當的: function fileproperties() // 方法名沒有清晰的描述以及下劃線分割單詞 function fileProperties() // 方法名沒有清晰的描述以及使用了駝峯法命名 function getfileproperties() // 還能夠!可是忘記了下劃線分割單詞 function getFileProperties() // 使用了駝峯法命名 function get_the_file_properties_from_the_file() // 方法名太冗長 適當的: function get_file_properties() // 清晰的方法名描述,下劃線分割單詞,所有使用小寫字母

 

 


變量命名
變量名應該只包含小寫字母,用下劃線分隔,而且能適當地指明變量的用途和內容


註釋
一般,代碼應該被詳細地註釋。這不只僅有助於給缺少經驗的程序員描述代碼的流程和意圖,並且有助於給你提供豐富的內容以讓你在幾個月後再看本身的代碼時仍能很好的理解。 註釋沒有強制規定的格式,可是咱們建議如下的形式。

文檔塊(DocBlock) 式的註釋要寫在類和方法的聲明前,這樣它們就能被集成開發環境(IDE)捕獲:

/** * Super Class * * @package Package Name * @subpackage Subpackage * @category Category * @author Author Name * @link http://example.com */ class Super_class {

/** * Encodes string for use in XML * * @access public * @param string * @return string */ function xml_encode($str)

使用行註釋時,在大的註釋塊和代碼間留一個空行。

// break up the string by newlines $parts = explode("\n", $str); // A longer comment that needs to give greater detail on what is // occurring and why can use multiple single-line comments. Try to // keep the width reasonable, around 70 characters is the easiest to // read. Don't hesitate to link to permanent external resources // that may provide greater detail: // // http://example.com/information_about_something/in_particular/ $parts = $this->foo($parts);

 

常量
常量命名除了要所有用大寫外,其餘的規則都和變量相同


TRUE, FALSE, 和 NULL 關鍵字應該老是徹底大寫的。

|| 有時讓人底氣不足,不容易辨識,由於在某些輸出設備上它不夠清晰(可能看起來像數字11). && 要優先於 AND ,不過二者均可以被接受, 使用 ! 時要在其先後都加一個空格。

不當的: if ($foo || $bar) if ($foo AND $bar) // 能夠,但有時不被經常使用的語法程序高亮推薦(高亮標識) if (!$foo) if (! is_array($foo)) 恰當的: if ($foo OR $bar) if ($foo && $bar) // 推薦 if ( ! $foo) if ( ! is_array($foo))

 

在返回和檢查你本身的變量時也要遵循這種嚴格的方法,必要時使用=== 和 !== 。
不當的: // 若是 'foo' 位於此字符串的起始處,strpos將返回 0, // 此處條件判斷的結果爲TRUE if (strpos($str, 'foo') == FALSE) 恰當的: if (strpos($str, 'foo') === FALSE)
不當的: function build_string($str = "") { if ($str == "") // uh-oh! 若是傳遞的參數是FALSE或者整數0那會怎麼樣? { } } 恰當的: function build_string($str = "") { if ($str === "") { } }

 


在已提交的附加組件所在的地方不能有調試代碼,它們被註釋掉的狀況除外,例如,建立附加組件時不能調用 var_dump(), print_r(), die(), 以及 exit() ,除非它們已經被註釋掉了。

// print_r($foo);

 

當你的類或文件名是一個常見詞語時,或者是極可能與另外一個PHP腳本同名時,使用一個惟一的前綴來避免衝突。你必須始終明白這一點:你的最終用戶可能會運行其它第三方的附加組件或者PHP腳本。選擇一個可以惟一標識開發者或公司的前綴。

 

數據庫表名
你的附加組件所用到的任何表都必須使用 'exp_' 這個前綴,而後是一個可以惟一標識開發者或公司的前綴,最後纔是一個簡短的描述性的表名。你不須要擔憂用戶安裝時所使用的數據庫前綴,由於CodeIgniter的數據庫類將根據實際狀況自動地對 'exp_' 進行轉換。

不當的: email_addresses // 缺乏這兩個前綴 pre_email_addresses // 缺乏 exp_ 前綴 exp_email_addresses // 缺乏惟一前綴 恰當的: exp_pre_email_addresses

一個文件一個類

在代碼中使用tab代替空格。這雖然看起來像是小事,可是使用tab代替空格有利於那些閱讀你的代碼的開發者在他們各自所使用的應用程序中自定義縮進方式。此外還有一個好處是,使用這種方式保存的文件稍微緊湊一點。

文件必須使用Unix換行符保存。這對於那些在Windows下的開發者來講更爲重要,但不管如何,確保你的文本編輯器已經設置爲使用Unix換行符來保存文件。

使用 Allman 風格縮進。除了類聲明之外,括號老是獨佔一行,且縮進與「屬於」它的控制語句同級。

方括號及圓括號內的空格符
一般狀況下,不要在方括號"[]"和圓括號"()"內增長任何空格符。惟一的例外就是爲了提升可讀性和區別開它們與函數,在接受參數的PHP語法控制結構所使用的括號裏,須要增長空格符(declare, do-while, elseif, for, foreach, if, switch, while)。

不恰當的: $arr[ $foo ] = 'foo'; 正確的: $arr[$foo] = 'foo'; // 數組鍵值的方括號內沒有空格 不恰當的: function foo ( $bar ) { } 正確的: function foo($bar) // 函數聲明的圓括號內沒有空格 { } 不恰當的: foreach( $query->result() as $row ) // PHP語法控制結構以後有空格,但不是在圓括號內 正確的: foreach ($query->result() as $row)

 

私有方法和變量
Methods and variables that are only accessed internally by your class, such as utility and helper functions that your public methods use for code abstraction, should be prefixed with an underscore.

若是方法和變量只在類的內部使用,應當使用下劃線做爲前綴。

每行一條語句


字符串
一直使用單引號除非你須要解析變量,若是須要解析變量請使用大括號, to prevent greedy token parsing. 若是字符串包含單引號的話你可使用雙引號,這樣就不用轉義了。


MySQL 的關鍵字一直大寫: SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN等等


函數的默認參數
可能的話,請提供函數的默認參數,這樣能夠阻止諸如錯誤的調用的 PHP 錯誤,同時能夠獲取公用的返回值,節約不少行代碼。例:

function foo($bar = '', $baz = FALSE)

 

 

 

 

 

 

 

 

 

 

 

 


準備數據
在驗證函數的基礎上,你可使用不一樣的方法準備好你的數據,例如,你能夠創建這樣的規則:

$rules['username'] = "trim|required|min_length[5]|max_length[12]|xss_clean";
$rules['password'] = "trim|required|matches[passconf]|md5";
$rules['passconf'] = "trim|required";
$rules['email'] = "trim|required|valid_email";

任何只有一個參數的 PHP 原生函數均可以被用做一個規則,好比 ``htmlspecialchars``, ``trim`` 等等。

上面的例子中,咱們「修剪」內容,轉換密碼區域爲 MD5 編碼,經過「XSS_CLEAN」函數檢測用戶名,移除危險的數據。

默認的PHP函數能爲一個規則使用一個參數,像 htmlspecialchars, trim, MD5, 等等.

 

 

 

 

 

 

 

 

 


數組的關鍵字其實是表單域的名字,對應的值是你想要在錯誤信息中顯示的全名。

如今你控制器中的index函數看起來應該像這樣:

function index()
{
$this->load->helper(array('form', 'url'));

$this->load->library('validation');

$rules['username'] = "required";
$rules['password'] = "required";
$rules['passconf'] = "required";
$rules['email'] = "required";

$this->validation->set_rules($rules);

$fields['username'] = 'Username';
$fields['password'] = 'Password';
$fields['passconf'] = 'Password Confirmation';
$fields['email'] = 'Email Address';

$this->validation->set_fields($fields);

if ($this->validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}

如今打開你的視圖文件myform.php,根據每一個表單域的名字更新它們的值。

<html>
<head>
<title>My Form</title>
</head>
<body>

<?=$this->validation->error_string; ?>

<?php echo form_open('form'); ?>

<h5>Username</h5>
<input type="text" name="username" value="<?php echo $this->validation->username;?>" size="50" />

<h5>Password</h5>
<input type="text" name="password" value="<?php echo $this->validation->password;?>" size="50" />

<h5>Password Confirm</h5>
<input type="text" name="passconf" value="<?php echo $this->validation->passconf;?>" size="50" />

<h5>Email Address</h5>
<input type="text" name="email" value="<?php echo $this->validation->email;?>" size="50" />

<div><input type="submit" value="Submit" /></div>

</form>

</body>
</html>


如今從新加載你的頁面,提交表單並觸發一個錯誤。你的表單將會被從新填充並且錯誤信息也會包含更多相關的表單域的名字。

 

單獨顯示錯誤
若是你想要在每一個表單域旁顯示錯誤,而不是顯示一個錯誤列表,你能夠像這樣修改你的表單:

<h5>Username</h5>

<?php echo $this->validation->username_error; ?>
<input type="text" name="username" value="<?php echo $this->validation->username;?>" size="50" />

<h5>Password</h5>
<?php echo $this->validation->password_error; ?>
<input type="text" name="password" value="<?php echo $this->validation->password;?>" size="50" />

<h5>Password Confirm</h5>
<?php echo $this->validation->passconf_error; ?>
<input type="text" name="passconf" value="<?php echo $this->validation->passconf;?>" size="50" />

<h5>Email Address</h5>
<?php echo $this->validation->email_error; ?>
<input type="text" name="email" value="<?php echo $this->validation->email;?>" size="50" />
若是沒有錯誤,不會顯示任何東西。若是有錯誤發生,消息將會使用你設置的分割標記顯示(<p> 標記是默認值)。

Note: 要這樣顯示錯誤信息,你必須以前使用$this->validation->set_fields 函數描述。錯誤將會被轉換成表單域名加"_error"後綴的變量。例如,你的用戶名錯誤的值能夠這樣訪問:
$this->validation->username_error.

 


處理選擇菜單,單選按鈕,和複選框
若是你使用了選擇菜單,單選按鈕,和複選框,你會想在出錯時保持原先的選擇。驗證類有三個函數幫助你完成這些:

set_select()
容許你顯示和提交時狀態一致的菜單項。第一個參數是選擇菜單的名字,第二個參數必須包含每一個選項的值。例如:

<select name="myselect">
<option value="one" <?php echo $this->validation->set_select('myselect', 'one'); ?> >One</option>
<option value="two" <?php echo $this->validation->set_select('myselect', 'two'); ?> >Two</option>
<option value="three" <?php echo $this->validation->set_select('myselect', 'three'); ?> >Three</option>
</select>
set_checkbox()
容許你顯示和提交時狀態一致的複選框。第一個參數是複選框的名字,第二個參數必須包含它的值,例如:

<input type="checkbox" name="mycheck" value="1" <?php echo $this->validation->set_checkbox('mycheck', '1'); ?> />

set_radio()
容許你顯示和提交時狀態一致的單選按鈕。第一個參數是單選按鈕的名字,第二個參數必須包含它的值:例如:

<input type="radio" name="myradio" value="1" <?php echo $this->validation->set_radio('myradio', '1'); ?> />

 

 


下表列出了全部可用的原生規則:

規則 參數 描述 例子
required No 若是表單元素爲空,返回 FALSE
matches Yes 若是表單元素值與參數中對應的表單字段的值不相等,返回 FALSE matches[form_item]
regex_match Yes 若是表單元素不匹配正則表達式,返回 FALSE regex_match[/regex/]
differs Yes 若是表單元素值與參數中對應的表單字段的值相等,返回 FALSE differs[form_item]
is_unique Yes 若是表單元素值在指定的表和字段中並不惟一,返回 FALSE 注意:這個規則須要啓用 查詢構造器 is_unique[table.field]
min_length Yes 若是表單元素值的長度小於參數值,返回 FALSE min_length[3]
max_length Yes 若是表單元素值的長度大於參數值,返回 FALSE max_length[12]
exact_length Yes 若是表單元素值的長度不等於參數值,返回 FALSE exact_length[8]
greater_than Yes 若是表單元素值小於或等於參數值或非數字,返回 FALSE greater_than[8]
greater_than_equal_to Yes 若是表單元素值小於參數值或非數字,返回 FALSE greater_than_equal_to[8]
less_than Yes 若是表單元素值大於或等於參數值或非數字,返回 FALSE less_than[8]
less_than_equal_to Yes 若是表單元素值大於參數值或非數字,返回 FALSE less_than_equal_to[8]
in_list Yes 若是表單元素值不在規定的列表中,返回 FALSE in_list[red,blue,green]
alpha No 若是表單元素值包含除字母之外的其餘字符,返回 FALSE
alpha_numeric No 若是表單元素值包含除字母和數字之外的其餘字符,返回 FALSE
alpha_numeric_spaces No 若是表單元素值包含除字母、數字和空格之外的其餘字符,返回 FALSE 應該在 trim 以後使用,避免首尾的空格
alpha_dash No 若是表單元素值包含除字母/數字/下劃線/破折號之外的其餘字符,返回 FALSE
numeric No 若是表單元素值包含除數字之外的字符,返回 FALSE
integer No 若是表單元素包含除整數之外的字符,返回 FALSE
decimal No 若是表單元素包含非十進制數字時,返回 FALSE
is_natural No 若是表單元素值包含了非天然數的其餘數值 (不包括零),返回 FALSE 天然數形如:0、一、二、3 .... 等等。
is_natural_no_zero No 若是表單元素值包含了非天然數的其餘數值 (包括零),返回 FALSE 非零的天然數:一、二、3 .... 等等。
valid_url No 若是表單元素值包含不合法的 URL,返回 FALSE
valid_email No 若是表單元素值包含不合法的 email 地址,返回 FALSE
valid_emails No 若是表單元素值包含不合法的 email 地址(地址之間用逗號分割),返回 FALSE
valid_ip No 若是表單元素值不是一個合法的 IP 地址,返回 FALSE 經過可選參數 「ipv4」 或 「ipv6」 來指定 IP 地址格式。
valid_base64 No 若是表單元素值包含除了 base64 編碼字符以外的其餘字符,返回 FALSE
註解

這些規則也能夠做爲獨立的函數被調用,例如:

$this->form_validation->required($string);
註解

你也可使用任何一個接受兩個參數的原生 PHP 函數(其中至少有一個參數是必須的,用於傳遞域值)
預處理參考
下表列出了全部可用的預處理方法:

名稱 參數 描述
prep_for_form No 將特殊字符的轉換,以即可以在表單域中顯示 HTML 數據,而不會破壞它
prep_url No 當 URL 丟失 「http://」 時,添加 「http://「
strip_image_tags No 移除 HTML 中的 image 標籤,只保留 URL
encode_php_tags No 將 PHP 標籤轉成實體
註解

你也可使用任何一個接受一個參數的原生 PHP 函數。 例如: trim() 、 htmlspecialchars() 、 urldecode() 等


 CI「超級對象」的問題
當Rick剛開始開發CI時,爲了讓CI在PHP4和PHP5下行爲一致,他必須在Base4文件中使用比較「醜陋」的代碼,無論醜不醜,咱們不用關心,只要CI可以在PHP4環境下工做得和PHP5同樣好就好了。

還有兩個問題值得在這裏提一下:

你能夠嘗試開發一個全新的對象並讓它參與工做。
你必須當心地爲你的網站設計架構,由於你不能在一個控制器裏調用另外一個控制器裏的方法。
讓咱們一個一個地來分析這兩個問題。 你記得我提到的T恤衫的那件事嗎?在調用一個成員函數時我一直收到「Call to a member function on a non-object」的出錯信息,這個出錯信息產生的緣由通常是由於你調用了一個類方法,可是忘了裝載這個類。換句話說,你寫了下列語句:

複製代碼到剪貼板PHP 代碼$this->Model_name->function();可是忘記在它以前調用:

複製代碼到剪貼板PHP 代碼$this->load->model('Model_name');還有一些其它狀況,好比,你在類的一個方法中裝載了模型,而後你嘗試在另外一個方法裏調用模型的方法,雖然在同一個對象中,這樣作也不行。因此最好的方法是在類的構造函數中裝載模型,而後能夠在這個類的全部方法中使用。

問題也可能更嚴重。若是寫你本身的類,舉例來講,你可能想要使用這個類存取數據庫, 或在你的config文件中讀取信息,換句話說,讓這個類存取CI超級對象的某些部分。(如何裝載你本身的類和類庫會在第13章中討論。)歸納起來,除非你的新類是一個控制器,一個模型或視圖,它不能在CI超級對象中被構造。所以你不能在你的新類中寫這樣的代碼:

複製代碼到剪貼板PHP 代碼$this->config->item('base_url');這不會工做的,由於對你的新類來講,$this-> 意味着它自己,而不是CI超級對象。取而代之地,你必須經過調用Instance類用另外一個變量名(一般是 $obj)把你的新類載入CI超級對象:

複製代碼到剪貼板PHP 代碼$obj =& get_instance();如今你能像調用CI超級對象同樣地調用它:

複製代碼到剪貼板PHP 代碼$obj->config->item('base_url');而且此次它能工做了。

所以,當你編寫你的新類時,記得它有它本身的標識符。讓咱們使用一個較簡短的例子來把這個問題講得更清楚一點。

你想要寫一個library類,用向你的服務器發出頁面請求的URL查找它的地理位置。這個library類有點像netGeo類,你能夠在下列網址找到它:

http://www.phpclasses.org/browse/package/514.html

這個類使用一個switch函數,根據URL的地域分派不一樣的網頁,好比來自英國和美國的URL請求,你就返回一個英語網頁,德國和奧地利的URL請求就返回一個德語網頁等等。如今,完整的URL會分紅兩個部分:基本URL(www.mysite.com/index.php)和附加的URL部分(mypage/germanversion)。

你須要從CI的config文件中取得基本URL部分。後半段網址經過你的新類的構造函數中的switch語句生成,若是這個客戶在德國,調用德國的頁面函數,依次類推。當這個工做在構造函數中作完之後,你須要把結果放到一個類屬性中,因此能夠在同一個類的其它函數中使用,這意味着:

基本URL從CI config文件中取得,這個只能經過CI超級對象的引用得到,換句話說,你能夠用 $obj->config->item('base_url'); 得到
URL的後半部分由你的新類的構造函數生成,並寫到一個類屬性中:$base。這個屬性與CI超級對象無關,它屬於你的新類,被引用爲 $this->base。
裝載時會用到兩個關鍵詞:$this-> 和 $obj->,在同一段代碼中被引用,舉例來講:

複製代碼到剪貼板PHP 代碼class my_new_class{
var $base;
My_new_class()
{
$obj =& get_instance();
// geolocation code here, returning a value through a switch statement
//this value is assigned to $local_url
$this->base = $obj->config->item('base_url');
$this->base .= $local_url;
}若是你不清楚這些概念,「Call to a member function on a non-object」就會頻繁的出現。上例中,若是你試着調用 $obj->base或 $this->config->item() 時,這個出錯信息就出現了。

 

CI 有三個函數、 show_error() 、 show_404() 和 log_message(),控制錯誤如何在你的系統上被顯示。 (不一樣尋常地,這些函數是全局性的: 你不須要裝載就能使用他們,用就好了!)。 事實上, show_error() 和 show_404() 一般默認產生; 前一個在屏幕頂端的一個整潔的小 HTML 格式的框子中顯示你的錯誤; 後一個在你企圖請求一個不存在的網頁時顯示一個'404'頁。

第三個函數,log_message(), 更有趣。你可能想要開發你本身的錯誤日誌,緣由有多種多樣的,其中一個是也許由於你不能訪問在你的ISP的Apache上的日誌文件。 首先, 你須要設定權限確保 /system/logs目錄是可讀寫的。 而後你在config文件中設定logging的級別:

複製代碼到剪貼板PHP 代碼/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|------------------------------------------------------------------------
|
| If you have enabled error logging, you can set an error threshold to
| determine what gets logged. Threshold options are:
|
| 0 = Disables logging
| 0 = Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Debug Messages
| 3 = Informational Messages
| 4 = All Messages
|
| For a live site you'll usually only enable Errors (1) to be logged
| otherwise your log files will fill up very fast.
|
*/
$config['log_threshold'] = 4;這樣會開啓日誌。

若是你修改 index.php 關閉錯誤信息顯示並不會使錯誤日誌不工做。 所以你能看到信息,但你的用戶看不到。

當你開啓日誌後, CI 天天產生新的記錄文件, 並把信息寫入這個文件。 可是當心, 這些記錄文件能快速地變得很大。

 

在實際使用過程當中,你可能須要開發在某件事發生時顯示特定出錯信息的錯誤處理代碼。

 


。。。。。。。。。。。。。。。。。。測試運行時間等等

profiler 類很是精彩,你在你的類的一個函數中插入一行代碼(它在構造函數中工做,所以放在那裏纔有意義.) 這行代碼是:

複製代碼到剪貼板PHP 代碼$this->output->enable_profiler(TRUE);若是你改變主意了, 你能夠修改它:

複製代碼到剪貼板PHP 代碼$this->output->enable_profiler(FALSE);插入這行代碼獲得的回報,就是你能在你的屏幕上獲得一個完整的報告。顯示CI超級對象和你的控制器的時間花銷以及$_POST數組和數據庫查詢等等所用的時間。在開發階段,這個特別有用。

若是你加上你本身的基準測試,它也會顯示這些。 你必須使用特別的名字命名你的基準測試-他們必須包括在"_start"和"_end"中,每一組的命名都要不同:

複製代碼到剪貼板PHP 代碼$this->benchmark->mark('fred_start');而且, 還有:

複製代碼到剪貼板PHP 代碼$this->benchmark->mark('fred_end');

相關文章
相關標籤/搜索