转载请注明出处: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. U盘启动时无USB-HDD选项的解决方案

    今天在使用一块老板子的时候 发现没有USB-HDD启动项 在启动顺序中只有 USB-ZIP(ZIP)  -FDD(软盘) -CDROM(光驱) 1.插入U盘 2.开机 3.在BIOS中找到Hard D ...

  2. 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)——引用

    在Django视图函数中经常出现类似于'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)的错误. ...

  3. 无人参与安装IIS 6.0

    使用脚本安装 IIS 从“开始”菜单,单击“运行”. 在“打开”框中,键入 cmd,然后单击“确定”. 在命令提示符下,键入 Sysocmgr.exe /i:sysoc.inf /u:%path_to ...

  4. 【转】Android用NDK和整套源码下编译JNI的不同

    原文网址:http://www.devdiv.com/android_ndk_jni_-blog-99-2101.html 前些天要写个jni程序,因为才几行代码,想着用ndk开发可能容易些,就先研究 ...

  5. 飘逸的python - 性能调优利器profile及其意义

    VIM 的作者Bram Moolenaar在一篇叫高效文本编辑器的7个习惯的ppt中有这么一段话. Three basic steps 1.    Detect inefficiency 2.    ...

  6. SQLServer 循环1百万插入测试数据

    1,首先创建student表 create table student ( sno int primary key , sname VARCHAR(200) ) 2,--向数据库中插入100万条随机姓 ...

  7. qt画刷和画笔

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #画刷和画笔:QBrush 定义了 QPainter 的填充模式,具 ...

  8. Hibernate(四)——缓存策略+lazy

    Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两 ...

  9. 创建一个jQuery UI的垂直进度条效果

    日期:2013-9-24  来源:GBin1.com 在线演示 缺省的jQuery UI只有水平的进度条效果,没有垂直的进度条效果,仅仅重新定义JQuery UI的CSS不能解决这个问题. 这里我们扩 ...

  10. .NET批量大数据插入性能分析及比较

    数据插入使用了以下几种方式 1. 逐条数据插入2. 拼接sql语句批量插入3. 拼接sql语句并使用Transaction4. 拼接sql语句并使用SqlTransaction5. 使用DataAda ...