转载请注明出处:http://blog.csdn.net/jh_zzz

从 index.php 开始看,

/** 初始化组件 */

Typecho_Widget:: widget('Widget_Init' );

看 Typecho_Widget:: widget 函数,查找 Widget/Init.php , Widget 下的文件都是从 Typecho_Widget 派生的,这里创建该对象实例,并将相关的 Request , Response 对象作为参数传递过去,然后调用该对象的 execute 方法。

看一下 Init 中的 execute ,首先会初始化一些参数,重点看看 MVC 架构的路由:

Typecho_Router:: setPathInfo($this -> request-> getPathInfo());

Typecho_Router:: setRoutes($options -> routingTable);

首先设置路径,然后初始化路由, $options -> routingTable 默认值是在安装时写在数据库中的,运行时再读出来,Typecho_Router 的 setRoutes 函数调用了 Typecho_Router_Parser 的 parse 函数, parse 函数遍历整个routingTable 数组,将处理后的路由数组返回给 Typecho_Router ,保存在 $_routingTable 中。一个典型的路由条目如下:

(

[url] => /

[widget] => Widget_Archive

[action] => render

[regx] => |^[/]?$|

[format] => /

[params] => Array

(

)

)

/** 注册一个初始化插件 */

Typecho_Plugin:: factory('index.php' )-> begin();

/** 开始路由分发 */

Typecho_Router:: dispatch();

dispatch 首先取到当前的 Url 路径信息,遍历 $_routingTable 找到匹配的路由条目,根据路由条目中的 widget ,action 设置加载相应 Widget 并执行其相应的方法,以 / 目录为例,最终执行的就是 Archive 的 render 方法。

看一下 Widget_Archived 的 render 方法,这块比较复杂:

首先得到设置的主题的目录:

$themeDir __TYPECHO_ROOT_DIR__ '/' __TYPECHO_THEME_DIR__ '/' $this -> options-> theme'/' ;

再往下看:

if (! $validated && empty ($this -> _archiveSlug)) {

$themeFile $this -> _archiveType '/' $this -> _archiveSlug '.php' ;

if (file_exists($themeDir $themeFile )) {

$this -> _themeFile $themeFile ;

$validated true ;

}

}

这里需要看一下 _archiveType 和 _archiveSlug 是怎么来的:

在 Widget_Archived 的 execute 函数中会根据 $this -> parameter-> type 执行相应的 handler 。

if (isset ($handles [$this -> parameter-> type])) {

$handle $handles [$this -> parameter-> type];

$this -> {$handle }($select $hasPushed );

} else {

$hasPushed $this -> pluginHandle()-> handle($this -> parameter-> type, $this $select );

}

$this -> parameter-> type 这个变量是在构造函数中赋值的 :

$this -> parameter-> type Typecho_Router:: $current ;

Typecho_Router:: $current 根据路由表可以查到对应于 index.php 就是 index 。

所以对于上面标黄的代码对应于 index.php 最终执行的是的是 $handles [‘index’] 对应的 handle ,就是 indexHandle。可以看到对于其他的 Handle 一般都会设置 _archiveType 及 _archiveSlug 变量, indexHandle 没有,因为_archiveType 默认就是 index ,所以在 index.php 中 _archiveType 等于 index , _archiveSlug 为空。

所以根据前面 render 函数中的代码,最终是找到对应于 $themeDir 下的 $this -> _archiveType '/' $this ->_archiveSlug '.php' 文件,然后直接包含进来,我们看到的就是这个文件的输出了。

/** 注册一个结束插件 */

Typecho_Plugin:: factory('index.php' )-> end();

Typecho 代码阅读笔记(一) - 页面渲染及路由机制的更多相关文章

  1. Typecho 代码阅读笔记(二) - 数据库访问

    转载请注明出处:http://blog.csdn.net/jh_zzz 这一块比较复杂,我还没有完全理解为什么要把 SQL 语句的组装搞这么复杂. 从一个普通皮肤页面开始 themes/default ...

  2. Typecho 代码阅读笔记(三) - 插件机制

    转载请注明出处:http://blog.csdn.net/jh_zzz 以 index.php 为例: /** 初始化组件 */ Typecho_Widget:: widget('Widget_Ini ...

  3. Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  4. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  5. [置顶] Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  6. Linux-3.0.8 input subsystem代码阅读笔记

    先乱序记录一下阅读Linux input subsystem代码的笔记. 在input device driver的入口代码部分,需要分配并初始化input device结构,内核提供的API是inp ...

  7. ASP.NET Core 源码阅读笔记(5) ---Microsoft.AspNetCore.Routing路由

    这篇随笔讲讲路由功能,主要内容在项目Microsoft.AspNetCore.Routing中,可以在GitHub上找到,Routing项目地址. 路由功能是大家都很熟悉的功能,使用起来也十分简单,从 ...

  8. 第一行代码阅读笔记---AndroidMainfest.xml分析

    按照这本书的指引,我随作者一样创建了一个安卓应用,开始了安卓开发的启程. 找到AndroidMainfest.xml这个文件,打开后看到了我创建的Activity在这个文件里被成功注册,文件内容如下: ...

  9. <<梦断代码>>阅读笔记三

    看完了这最后三分之一的<梦断代码>,意味着这本软件行业的著作已经被我粗略地过了一遍. 在这最后三分之一的内容中,我深入了解了在大型软件项目的运作过程中存在的困难和艰辛.一个大型软件项目的成 ...

随机推荐

  1. 【CCNA学习笔记】1.思科路由器的基本配置

    教学视频来源:http://edu.51cto.com/lesson/id-10930.html. 怎么安装模块.连交叉线什么的视频里面老师说的很清楚了,我只记录一下IOS配置的命令(虽然一副不明觉厉 ...

  2. LeetCode_Triangle

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  3. MySQL数据库配置主从服务器实现双机热备

    转自:http://www.cnblogs.com/cchun/p/3712637.html 一.安装MySQL 说明:在两台MySQL服务器192.168.21.169和192.168.21.168 ...

  4. RedHat9通过Host-only配置网络连接

    首先我用的是VMware8版本安装的RedHat9.VMware给我们提供了三种让虚拟机里的安装系统连上网的方式.分别是Host-only,Bridge,NAT.我要讲的是Host-only. 第一步 ...

  5. UESTC_敢说就敢做 CDOJ 631

    敢说就敢做 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  6. Hdu3640-I, zombie(模拟+二分)

    The "endless" model in "I, zombie" of "Plants vs. Zombies" is my favou ...

  7. 訪问远程WAMP 下phpmyadmin

    WAMP环境是一个非常优秀的webservice集成环境,它集成的phpmyadmin也是一款非常优秀的数据库訪问软件.wamp默认安装下,phpmyadmin工具仅仅能本地用,在站点开发中,数据库都 ...

  8. QOdbc 读写 excel

    ).toString(); ).toInt(); qDebug()<< name << age <<endl; } // 关闭数据库 db.close(); } i ...

  9. Oracle:grouping和rollup

    Oracle grouping和rollup简单测试 SQL,,,) group by department_id order by department_id; DEPARTMENT_ID SUM( ...

  10. html_day3

    总结学习html的第一天 表格的结构说明 <table></table> <tr></tr> <td></td> <th& ...