typecho源碼閱讀-路由部分

路由表初始化

從入口文件index.php開始
首先Typecho_Widget::widget('Widget_Init');
跟進(jìn)發(fā)現(xiàn)在\var\Widget\Widget_Options::execute()自動(dòng)初始化路由表

    public function execute()
    {
        $this->db->fetchAll($this->db->select()->from('table.options')
        ->where('user = 0'), array($this, 'push'));
        /* 從數(shù)據(jù)庫(kù)中取出架诞,其中有序列化的routeTable */
        ...
        /** 自動(dòng)初始化路由表 */
        $this->routingTable = unserialize($this->routingTable);
        if (!isset($this->routingTable[0])) {
            /** 解析路由并緩存 */
            /* 
            不存在 this->routingTable[0] 時(shí),
            通過路由解析器來(lái)構(gòu)造規(guī)則斜筐,并把其存入數(shù)據(jù)庫(kù)中
            */
            $parser = new Typecho_Router_Parser($this->routingTable);
            $parsedRoutingTable = $parser->parse();
            $this->routingTable = array_merge(array($parsedRoutingTable), $this->routingTable);
            $this->db->query($this->db->update('table.options')->rows(array('value' => serialize($this->routingTable)))
            ->where('name = ?', 'routingTable'));
        }
    }

image.png

初始化路由類調(diào)用Typecho_Router::setRoutes($options->routingTable);
得到所有的路由表

image.png

路由解析器

不存在 $this->routingTable[0] 時(shí)
可以促發(fā)Typecho_Router_Parser($this->routingTable);,
至于啥時(shí)候不存在 $this->routingTable[0],有多種情況存在,可以全局搜索routingTable\[0\]查看unset函數(shù)
接下來(lái)看\var\Typecho\Router\Parser.php

//先初始化
public function __construct(array $routingTable)
    {
        $this->_routingTable = $routingTable;

        $this->_defaultRegx = array(
            'string' => '(.%s)',
            'char'   => '([^/]%s)',
            'digital'=> '([0-9]%s)',
            'alpha'  => '([_0-9a-zA-Z-]%s)',
            'alphaslash'  => '([_0-9a-zA-Z-/]%s)',
            'split'  => '((?:[^/]+/)%s[^/]+)',
        );
    }
//定義路由規(guī)則
public function parse()
    {
        $result = array();

        foreach ($this->_routingTable as $key => $route) {
            $this->_params = array();
            $route['regx'] = preg_replace_callback("/%([^%]+)%/", array($this, '_match'),
            preg_quote(str_replace(array('[', ']', ':'), array('%', '%', ' '), $route['url'])));

            /** 處理斜線 */
            $route['regx'] = rtrim($route['regx'], '/');
            $route['regx'] = '|^' . $route['regx'] . '[/]?$|';

            $route['format'] = preg_replace("/\[([^\]]+)\]/", "%s", $route['url']);
            $route['params'] = $this->_params;

            $result[$key] = $route;
        }

        return $result;
    }

然后通過\var\Widget\Widget_Options::execute()更新數(shù)據(jù)庫(kù)

路由分發(fā)

index.php里調(diào)用Typecho_Router::dispatch();
http://..../index.php/archives/1/為例

public static function dispatch()
    {
        /** 獲取PATHINFO */
        $pathInfo = self::getPathInfo();
        /* 
           $_routingTable 路由表在上述步驟中獲得
           每個(gè)路由都有一個(gè)自己的路由規(guī)則 酿矢,$route['regx']
           不滿足直接返回flase
        */
        foreach (self::$_routingTable as $key => $route) {
            if (preg_match($route['regx'], $pathInfo, $matches)) {
                self::$current = $key;

                try {
                    /** 載入?yún)?shù) */
                    $params = NULL;

                    if (!empty($route['params'])) {
                        unset($matches[0]);
                        $params = array_combine($route['params'], $matches);
                    }
                    /* $params = {'cid':'1'}  */
                    $widget = Typecho_Widget::widget($route['widget'], NULL, $params);
                    /* 通過這條獲得文章內(nèi)容 */
                    if (isset($route['action'])) {
                        $widget->{$route['action']}();
                    }
                    /*
                      $route['action'] = 'render'
                      此步獲取模板
                    */
                    Typecho_Response::callback();
                    return;

                } catch (Exception $e) {
                    if (404 == $e->getCode()) {
                        Typecho_Widget::destory($route['widget']);
                        continue;
                    }

                    throw $e;
                }
            }
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颅围,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桩盲,老刑警劉巖胳喷,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湃番,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吭露,警方通過查閱死者的電腦和手機(jī)吠撮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讲竿,“玉大人泥兰,你說我怎么就攤上這事√赓鳎” “怎么了鞋诗?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)迈嘹。 經(jīng)常有香客問我削彬,道長(zhǎng),這世上最難降的妖魔是什么江锨? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任吃警,我火速辦了婚禮,結(jié)果婚禮上啄育,老公的妹妹穿的比我還像新娘酌心。我一直安慰自己,他們只是感情好挑豌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布安券。 她就那樣靜靜地躺著墩崩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侯勉。 梳的紋絲不亂的頭發(fā)上鹦筹,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音址貌,去河邊找鬼铐拐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛练对,可吹牛的內(nèi)容都是我干的遍蟋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼螟凭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虚青!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起螺男,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棒厘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后下隧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奢人,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年淆院,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了达传。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迫筑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宗弯,到底是詐尸還是另有隱情脯燃,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布蒙保,位于F島的核電站辕棚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏邓厕。R本人自食惡果不足惜逝嚎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望详恼。 院中可真熱鬧补君,春花似錦、人聲如沸昧互。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至叽掘,卻和暖如春楣铁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背更扁。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工盖腕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浓镜。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓溃列,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親竖哩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哭廉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354