CI框架源碼研讀(路由解析)

? ? ? ? ?上篇文章當(dāng)中我們提到实牡,在CodeIgniter.php中,解析出你訪問的url所對應(yīng)的controllers和action,然后在調(diào)用call_user_func_array()方法,進(jìn)入到action中岳守,而這里是如何得到這個對應(yīng)關(guān)系的呢,這就是我們現(xiàn)在要討論的內(nèi)容碌冶。

1湿痢、CodeIgniter.php

?我們首先來到CodeIgniter.php,發(fā)現(xiàn)這其實是在Router類中實現(xiàn)的扑庞,如下源碼:

$RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL);

$class = ucfirst($RTR->class);

$method = $RTR->method;

2譬重、Router.php

我們進(jìn)去Router.php中一探究竟,Router類中的構(gòu)造函數(shù)核心是這里:

$this->_set_routing();

_set_routing方法其實核心做這幾步操作:

$_d = $this->config->item('directory_trigger');

$this->set_directory($_d);

$_c = trim($this->config->item('controller_trigger'));

$this->set_class($_GET[$_c]);

$_f = trim($this->config->item('function_trigger'));

$this->set_method($_GET[$_f]);

$this->_parse_routes();

分別從全局變量_GET數(shù)組中獲取 directory,class,method,他們的trigger可以在配置文件中配置罐氨。當(dāng)然這是在 enable_query_strings 設(shè)置為true的情況下臀规。接下來就進(jìn)入了最關(guān)鍵的方法中_parse_routes方法:

我們在CI的路由配置中,可以如下配置:

$route['products']['put']='product/insert';

就是因為在_parse_routes中的這段代碼:

$http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli';

$val = array_change_key_case($val, CASE_LOWER);

if (isset($val[$http_verb])){

$val = $val[$http_verb];}

else{continue;}

HTTP verbs (GET, PUT, POST, DELETE, PATCH) 有這么幾種.而我們在配置中可以這么配置:

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

是因為_parse_routes中的這段代碼:

$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);

路由配置中更加可以配置回調(diào)函數(shù)如:

$route['products/([a-zA-Z]+)/edit/(\d+)']=function($product_type,$id){return'catalog/product_edit/'.strtolower($product_type).'/'.$id;};

是因為有這段代碼:

if ( ! is_string($val) && is_callable($val)){

array_shift($matches);

$val = call_user_func_array($val, $matches);

}

而一般的配置:

else if (strpos($val, ') !== FALSE && strpos($key, '(') !== FALSE){

$val = preg_replace('#^'.$key.'$#', $val, $uri);

}

最后調(diào)用了:

$this->_set_request(array_values($this->uri->segments));

_set_request方法當(dāng)中

$this->set_class($segments[0]);

if (isset($segments[1])){

$this->set_method($segments[1]);

}else{

$segments[1] = 'index';

}

set了class和method,這就得到了我們在開始CodeIgniter.php中所需要的class和method

3栅隐、Uri.php

這里要說下這個上面uri的來路:

$uri = implode('/', $this->uri->segments);

我們進(jìn)入Uri類中查看究竟:

核心的方法是_parse_request_uri塔嬉,在方法體中,

$uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']);

$query = isset($uri['query']) ? $uri['query'] : '';

$uri = isset($uri['path']) ? $uri['path'] : '';

return $this->_remove_relative_directory($uri);

主要是用parse_url解析出url當(dāng)中的path和query租悄,然后進(jìn)行去除相對路徑的處理谨究。

$this->uri->segments這個成員變量中存儲的就是explode('/', trim($uri, '/') 后的數(shù)組,在_set_uri_string方法中賦值泣棋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胶哲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子潭辈,更是在濱河造成了極大的恐慌鸯屿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件把敢,死亡現(xiàn)場離奇詭異碾盟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)技竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屈藐,“玉大人榔组,你說我怎么就攤上這事×撸” “怎么了搓扯?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長包归。 經(jīng)常有香客問我锨推,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任换可,我火速辦了婚禮椎椰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沾鳄。我一直安慰自己慨飘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布译荞。 她就那樣靜靜地躺著瓤的,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吞歼。 梳的紋絲不亂的頭發(fā)上圈膏,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機(jī)與錄音篙骡,去河邊找鬼稽坤。 笑死,一個胖子當(dāng)著我的面吹牛医增,可吹牛的內(nèi)容都是我干的慎皱。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼叶骨,長吁一口氣:“原來是場噩夢啊……” “哼茫多!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忽刽,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤天揖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后跪帝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體今膊,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年伞剑,在試婚紗的時候發(fā)現(xiàn)自己被綠了斑唬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡黎泣,死狀恐怖恕刘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抒倚,我是刑警寧澤褐着,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站托呕,受9級特大地震影響含蓉,放射性物質(zhì)發(fā)生泄漏频敛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一馅扣、第九天 我趴在偏房一處隱蔽的房頂上張望斟赚。 院中可真熱鬧,春花似錦岂嗓、人聲如沸汁展。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽食绿。三九已至,卻和暖如春公罕,著一層夾襖步出監(jiān)牢的瞬間器紧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工楼眷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留铲汪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓罐柳,卻偏偏與公主長得像掌腰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子张吉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容