標籤:簡化 not rac else span name out 開放 href
上一節(CI架構原始碼閱讀筆記1 - 環境準備、基本術語和架構流程)中,我們提到了CI架構的基本流程。這裡再次貼出流程圖。以備參考:
作為CI架構的入口檔案。原始碼閱讀,自然由此開始。
在原始碼閱讀的過程中,我們並不會逐行進行解釋。而僅僅解釋核心的功能和實現。
1. 設定應用程式環境
define(‘ENVIRONMENT‘, ‘development‘);
這裡的development能夠是不論什麼你喜歡的環境名稱(比方dev,再如test)。相相應的,你要在以下的switch case代碼塊中,對設定的環境做相關的錯誤控制,否則。CI架構會覺得你沒有配置好相應的環境,從而退出進程並給出相應的錯誤資訊:
default: exit(‘The application environment is not set correctly.‘);
為什麼一開始就要配置ENVIRONMENT?這是由於,CI架構中非常多組件都依賴於ENVIRONMENT的配置。我們看一下system中,引用ENVIRONMENT的地方:
能夠看到,非常多組件都依賴於ENVIRONMENT.比如,查看system/config/Common.php, 這當中有一段引入設定檔的代碼。是這樣實現的:
if ( ! defined(‘ENVIRONMENT‘) OR ! file_exists($file_path = APPPATH.‘config/‘.ENVIRONMENT.‘/config.php‘)){ $file_path = APPPATH.‘config/config.php‘;}
在CI架構中,非常多設定檔都是通過這樣的方式引入的,因此ENVRIONMENT對於CI架構的正確執行時必須的。所以須要在開始的時候配置好ENVIRONMENT。設定ENVIRONMENT的一個優點是:能夠非常方便的切換系統的配置而不必改動系統代碼。比如,在系統進入測試階段時,database配置為測試的資料庫,而在系統測試完成時,database切換到線上的資料庫。
這好比是用一個開關控制了系統的環境切換。自然是非常方便的。
2. 配置系統檔案夾和應用程式檔案夾
CI架構同意你將系統核心原始碼和應用程式代碼分開放置。可是你必須設定好系統的system目錄和application目錄(相同,目錄名字能夠是不論什麼合法的目錄名稱,而不一定使用’system’和’application’):
$system_path = ‘system‘;$application_folder = ‘application‘;
接下來,有這麼一段代碼:
if (defined(‘STDIN‘)){ chdir(dirname(__FILE__));}
這段代碼是幹嘛的呢?首先。STDIN、STDOUT、STDERR是PHP以 CLI(Command Line Interface)模式執行而定義的三個常量。這三個常量類似於Shell的stdin,stdout,stdout,各自是PHP CLI模式下的標準輸入、標準輸出和標準錯誤流。也就是說,這三行代碼是為了保證命令列模式下,CI架構能夠正常執行。關於PHP CLI的很多其它細節能夠參考:http://www.php-cli.com/
3. system檔案夾的正確性驗證和application檔案夾驗證
(1). system檔案夾的正確性驗證
Realpath返回的是檔案夾或檔案的絕對檔案夾名(沒有最後的/)
if (realpath($system_path) !== FALSE){ $system_path = realpath($system_path).‘/‘;}$system_path = rtrim($system_path, ‘/‘).‘/‘;if ( ! is_dir($system_path)){ exit("xxxxxxxx");}
幾個定義的常量(PATH結尾的常量表示檔案夾路徑,DIR結尾的變數表示檔案夾名):
a. SELF(這裡指index.php檔案)
b. EXT(deprecated,廢棄的。不必關注)
c. BASEPATH(system目錄的路徑)
d. FCPATH(前端控制器的路徑)
e. SYSDIR(系統system檔案夾名)
f. APPPATH(應用程式路徑)
查看全部定義的常量的方法:
Print_r(get_defined_constants());
(2)application的檔案夾驗證。
代碼較簡單,不做過多的解釋:
if (is_dir($application_folder)){ define(‘APPPATH‘, $application_folder.‘/‘);}else{ if ( ! is_dir(BASEPATH.$application_folder.‘/‘)) { exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF); } define(‘APPPATH‘, BASEPATH.$application_folder.‘/‘);}
入口檔案的最後一行,引入CodeIgniter.php(也是下一步閱讀的關鍵)。
CodeIgniter.php被稱為bootstrap file。也就是它是一個引導檔案,是CI架構運行流程的核心檔案。
require_once BASEPATH.‘core/CodeIgniter.php‘;
總結一下。index.php並沒有做太多複雜的工作。而是類似一個後勤。為CI架構的執行提供了一系列配置參數和正確性驗證,而這些配置和驗證,是CI架構可以正常執行的關鍵。
最後。依照慣例。貼一下整個檔案的原始碼(簡化凝視版):
1 <?php 2 3 define(‘ENVIRONMENT‘, ‘development‘); 4 5 if (defined(‘ENVIRONMENT‘)) 6 { 7 switch (ENVIRONMENT) 8 { 9 case ‘development‘:10 error_reporting(E_ALL);11 break;12 13 case ‘testing‘:14 case ‘production‘:15 error_reporting(0);16 break;17 18 default:19 exit(‘The application environment is not set correctly.‘);20 }21 }22 23 /*24 * SYSTEM FOLDER NAME25 */26 $system_path = ‘system‘;27 28 /*29 * APPLICATION FOLDER NAME30 */31 $application_folder = ‘application‘;32 33 /*34 * Resolve the system path for increased reliability35 */36 if (defined(‘STDIN‘))37 {38 chdir(dirname(__FILE__));39 }40 41 if (realpath($system_path) !== FALSE)42 {43 $system_path = realpath($system_path).‘/‘;44 }45 46 $system_path = rtrim($system_path, ‘/‘).‘/‘;47 48 if ( ! is_dir($system_path))49 {50 exit("xxxxxxxx");51 }52 53 /*54 * set the main path constants55 */56 // The name of THIS file57 define(‘SELF‘, pathinfo(__FILE__, PATHINFO_BASENAME));58 59 // this global constant is deprecataaed.60 define(‘EXT‘, ‘.php‘);61 62 // Path to the system folder63 define(‘BASEPATH‘, str_replace("\\", "/", $system_path));64 65 // Path to the front controller (this file)66 define(‘FCPATH‘, str_replace(SELF, ‘‘, __FILE__));67 68 // Name of the "system folder"69 define(‘SYSDIR‘, trim(strrchr(trim(BASEPATH, ‘/‘), ‘/‘), ‘/‘));70 71 // The path to the "application" folder72 if (is_dir($application_folder))73 {74 define(‘APPPATH‘, $application_folder.‘/‘);75 }76 else77 {78 if ( ! is_dir(BASEPATH.$application_folder.‘/‘))79 {80 exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF);81 }82 83 define(‘APPPATH‘, BASEPATH.$application_folder.‘/‘);84 }85 86 require_once BASEPATH.‘core/CodeIgniter.php‘;
CI架構原始碼閱讀筆記2 一切的入口 index.php