CI 學習筆記、記錄


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

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

[php] view plaincopy

  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();網址

表單驗證類 使用

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

$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');

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

 


舉例來說,如果你的 URI 是這樣的:

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、1、2、3 .... 等等。
is_natural_no_zero No 如果表單元素值包含了非自然數的其他數值 (包括零),返回 FALSE 非零的自然數:1、2、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');


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com