嗷嗷答 - 嗷嗷好的公务员考试网络答题平台

typecho路由机制详解

作者:不烦恼 发布时间:April 16, 2011 分类:快乐学习

本文介绍的是typecho的路由机制
路由机制是typecho的核心,有很多功能都是基于路由功能设计的,理解并熟悉TE的路由机制将非常有助于插件的开发。
完整的路由表如下(由于代码较长,请进内页浏览):

  1. 0 =>
  2. 'index' =>
  3. 'url' => '/',
  4. 'widget' => 'Widget_Archive',
  5. 'action' => 'render',
  6. 'regx' => '|^[/]?$|',
  7. 'format' => '/',
  8. 'params' =>
  9. ),
  10. ),
  11. 'do' =>
  12. 'url' => '/action/[action:alpha]',
  13. 'widget' => 'Widget_Do',
  14. 'action' => 'action',
  15. 'regx' => '|^/action/([_0-9a-zA-Z-]+)[/]?$|',
  16. 'format' => '/action/%s',
  17. 'params' =>
  18. 0 => 'action',
  19. ),
  20. ),
  21. 'post' =>
  22. 'url' => '/archives/[cid:digital]/',
  23. 'widget' => 'Widget_Archive',
  24. 'action' => 'render',
  25. 'regx' => '|^/archives/([0-9]+)[/]?$|',
  26. 'format' => '/archives/%s/',
  27. 'params' =>
  28. 0 => 'cid',
  29. ),
  30. ),
  31. 'attachment' =>
  32. 'url' => '/attachment/[cid:digital]/',
  33. 'widget' => 'Widget_Archive',
  34. 'action' => 'render',
  35. 'regx' => '|^/attachment/([0-9]+)[/]?$|',
  36. 'format' => '/attachment/%s/',
  37. 'params' =>
  38. 0 => 'cid',
  39. ),
  40. ),
  41. 'category' =>
  42. 'url' => '/category/[slug]/',
  43. 'widget' => 'Widget_Archive',
  44. 'action' => 'render',
  45. 'regx' => '|^/category/([^/]+)[/]?$|',
  46. 'format' => '/category/%s/',
  47. 'params' =>
  48. 0 => 'slug',
  49. ),
  50. ),
  51. 'tag' =>
  52. 'url' => '/tag/[slug]/',
  53. 'widget' => 'Widget_Archive',
  54. 'action' => 'render',
  55. 'regx' => '|^/tag/([^/]+)[/]?$|',
  56. 'format' => '/tag/%s/',
  57. 'params' =>
  58. 0 => 'slug',
  59. ),
  60. ),
  61. 'author' =>
  62. 'url' => '/author/[uid:digital]/',
  63. 'widget' => 'Widget_Archive',
  64. 'action' => 'render',
  65. 'regx' => '|^/author/([0-9]+)[/]?$|',
  66. 'format' => '/author/%s/',
  67. 'params' =>
  68. 0 => 'uid',
  69. ),
  70. ),
  71. 'search' =>
  72. 'url' => '/search/[keywords]/',
  73. 'widget' => 'Widget_Archive',
  74. 'action' => 'render',
  75. 'regx' => '|^/search/([^/]+)[/]?$|',
  76. 'format' => '/search/%s/',
  77. 'params' =>
  78. 0 => 'keywords',
  79. ),
  80. ),
  81. 'index_page' =>
  82. 'url' => '/page/[page:digital]/',
  83. 'widget' => 'Widget_Archive',
  84. 'action' => 'render',
  85. 'regx' => '|^/page/([0-9]+)[/]?$|',
  86. 'format' => '/page/%s/',
  87. 'params' =>
  88. 0 => 'page',
  89. ),
  90. ),
  91. 'category_page' =>
  92. 'url' => '/category/[slug]/[page:digital]/',
  93. 'widget' => 'Widget_Archive',
  94. 'action' => 'render',
  95. 'regx' => '|^/category/([^/]+)/([0-9]+)[/]?$|',
  96. 'format' => '/category/%s/%s/',
  97. 'params' =>
  98. 0 => 'slug',
  99. 1 => 'page',
  100. ),
  101. ),
  102. 'tag_page' =>
  103. 'url' => '/tag/[slug]/[page:digital]/',
  104. 'widget' => 'Widget_Archive',
  105. 'action' => 'render',
  106. 'regx' => '|^/tag/([^/]+)/([0-9]+)[/]?$|',
  107. 'format' => '/tag/%s/%s/',
  108. 'params' =>
  109. 0 => 'slug',
  110. 1 => 'page',
  111. ),
  112. ),
  113. 'author_page' =>
  114. 'url' => '/author/[uid:digital]/[page:digital]/',
  115. 'widget' => 'Widget_Archive',
  116. 'action' => 'render',
  117. 'regx' => '|^/author/([0-9]+)/([0-9]+)[/]?$|',
  118. 'format' => '/author/%s/%s/',
  119. 'params' =>
  120. 0 => 'uid',
  121. 1 => 'page',
  122. ),
  123. ),
  124. 'search_page' =>
  125. 'url' => '/search/[keywords]/[page:digital]/',
  126. 'widget' => 'Widget_Archive',
  127. 'action' => 'render',
  128. 'regx' => '|^/search/([^/]+)/([0-9]+)[/]?$|',
  129. 'format' => '/search/%s/%s/',
  130. 'params' =>
  131. 0 => 'keywords',
  132. 1 => 'page',
  133. ),
  134. ),
  135. 'archive_year' =>
  136. 'url' => '/[year:digital:4]/',
  137. 'widget' => 'Widget_Archive',
  138. 'action' => 'render',
  139. 'regx' => '|^/([0-9]{4})[/]?$|',
  140. 'format' => '/%s/',
  141. 'params' =>
  142. 0 => 'year',
  143. ),
  144. ),
  145. 'archive_month' =>
  146. 'url' => '/[year:digital:4]/[month:digital:2]/',
  147. 'widget' => 'Widget_Archive',
  148. 'action' => 'render',
  149. 'regx' => '|^/([0-9]{4})/([0-9]{2})[/]?$|',
  150. 'format' => '/%s/%s/',
  151. 'params' =>
  152. 0 => 'year',
  153. 1 => 'month',
  154. ),
  155. ),
  156. 'archive_day' =>
  157. 'url' => '/[year:digital:4]/[month:digital:2]/[day:digital:2]/',
  158. 'widget' => 'Widget_Archive',
  159. 'action' => 'render',
  160. 'regx' => '|^/([0-9]{4})/([0-9]{2})/([0-9]{2})[/]?$|',
  161. 'format' => '/%s/%s/%s/',
  162. 'params' =>
  163. 0 => 'year',
  164. 1 => 'month',
  165. 2 => 'day',
  166. ),
  167. ),
  168. 'archive_year_page' =>
  169. 'url' => '/[year:digital:4]/page/[page:digital]/',
  170. 'widget' => 'Widget_Archive',
  171. 'action' => 'render',
  172. 'regx' => '|^/([0-9]{4})/page/([0-9]+)[/]?$|',
  173. 'format' => '/%s/page/%s/',
  174. 'params' =>
  175. 0 => 'year',
  176. 1 => 'page',
  177. ),
  178. ),
  179. 'archive_month_page' =>
  180. 'url' => '/[year:digital:4]/[month:digital:2]/page/[page:digital]/',
  181. 'widget' => 'Widget_Archive',
  182. 'action' => 'render',
  183. 'regx' => '|^/([0-9]{4})/([0-9]{2})/page/([0-9]+)[/]?$|',
  184. 'format' => '/%s/%s/page/%s/',
  185. 'params' =>
  186. 0 => 'year',
  187. 1 => 'month',
  188. 2 => 'page',
  189. ),
  190. ),
  191. 'archive_day_page' =>
  192. 'url' => '/[year:digital:4]/[month:digital:2]/[day:digital:2]/page/[page:digital]/',
  193. 'widget' => 'Widget_Archive',
  194. 'action' => 'render',
  195. 'regx' => '|^/([0-9]{4})/([0-9]{2})/([0-9]{2})/page/([0-9]+)[/]?$|',
  196. 'format' => '/%s/%s/%s/page/%s/',
  197. 'params' =>
  198. 0 => 'year',
  199. 1 => 'month',
  200. 2 => 'day',
  201. 3 => 'page',
  202. ),
  203. ),
  204. 'comment_page' =>
  205. 'url' => '[permalink:string]/comment-page-[commentPage:digital]',
  206. 'widget' => 'Widget_Archive',
  207. 'action' => 'render',
  208. 'regx' => '|^(.+)/comment-page-([0-9]+)[/]?$|',
  209. 'format' => '%s/comment-page-%s',
  210. 'params' =>
  211. 0 => 'permalink',
  212. 1 => 'commentPage',
  213. ),
  214. ),
  215. 'feed' =>
  216. 'url' => '/feed[feed:string:0]',
  217. 'widget' => 'Widget_Archive',
  218. 'action' => 'feed',
  219. 'regx' => '|^/feed(.*)[/]?$|',
  220. 'format' => '/feed%s',
  221. 'params' =>
  222. 0 => 'feed',
  223. ),
  224. ),
  225. 'feedback' =>
  226. 'url' => '[permalink:string]/[type:alpha]',
  227. 'widget' => 'Widget_Feedback',
  228. 'action' => 'action',
  229. 'regx' => '|^(.+)/([_0-9a-zA-Z-]+)[/]?$|',
  230. 'format' => '%s/%s',
  231. 'params' =>
  232. 0 => 'permalink',
  233. 1 => 'type',
  234. ),
  235. ),
  236. 'page' =>
  237. 'url' => '/[slug].html',
  238. 'widget' => 'Widget_Archive',
  239. 'action' => 'render',
  240. 'regx' => '|^/([^/]+)\\.html[/]?$|',
  241. 'format' => '/%s.html',
  242. 'params' =>
  243. 0 => 'slug',
  244. ),
  245. ),
  246. ),
  247. 'index' =>
  248. 'url' => '/',
  249. 'widget' => 'Widget_Archive',
  250. 'action' => 'render',
  251. ),
  252. 'do' =>
  253. 'url' => '/action/[action:alpha]',
  254. 'widget' => 'Widget_Do',
  255. 'action' => 'action',
  256. ),
  257. 'post' =>
  258. 'url' => '/archives/[cid:digital]/',
  259. 'widget' => 'Widget_Archive',
  260. 'action' => 'render',
  261. ),
  262. 'attachment' =>
  263. 'url' => '/attachment/[cid:digital]/',
  264. 'widget' => 'Widget_Archive',
  265. 'action' => 'render',
  266. ),
  267. 'category' =>
  268. 'url' => '/category/[slug]/',
  269. 'widget' => 'Widget_Archive',
  270. 'action' => 'render',
  271. ),
  272. 'tag' =>
  273. 'url' => '/tag/[slug]/',
  274. 'widget' => 'Widget_Archive',
  275. 'action' => 'render',
  276. ),
  277. 'author' =>
  278. 'url' => '/author/[uid:digital]/',
  279. 'widget' => 'Widget_Archive',
  280. 'action' => 'render',
  281. ),
  282. 'search' =>
  283. 'url' => '/search/[keywords]/',
  284. 'widget' => 'Widget_Archive',
  285. 'action' => 'render',
  286. ),
  287. 'index_page' =>
  288. 'url' => '/page/[page:digital]/',
  289. 'widget' => 'Widget_Archive',
  290. 'action' => 'render',
  291. ),
  292. 'category_page' =>
  293. 'url' => '/category/[slug]/[page:digital]/',
  294. 'widget' => 'Widget_Archive',
  295. 'action' => 'render',
  296. ),
  297. 'tag_page' =>
  298. 'url' => '/tag/[slug]/[page:digital]/',
  299. 'widget' => 'Widget_Archive',
  300. 'action' => 'render',
  301. ),
  302. 'author_page' =>
  303. 'url' => '/author/[uid:digital]/[page:digital]/',
  304. 'widget' => 'Widget_Archive',
  305. 'action' => 'render',
  306. ),
  307. 'search_page' =>
  308. 'url' => '/search/[keywords]/[page:digital]/',
  309. 'widget' => 'Widget_Archive',
  310. 'action' => 'render',
  311. ),
  312. 'archive_year' =>
  313. 'url' => '/[year:digital:4]/',
  314. 'widget' => 'Widget_Archive',
  315. 'action' => 'render',
  316. ),
  317. 'archive_month' =>
  318. 'url' => '/[year:digital:4]/[month:digital:2]/',
  319. 'widget' => 'Widget_Archive',
  320. 'action' => 'render',
  321. ),
  322. 'archive_day' =>
  323. 'url' => '/[year:digital:4]/[month:digital:2]/[day:digital:2]/',
  324. 'widget' => 'Widget_Archive',
  325. 'action' => 'render',
  326. ),
  327. 'archive_year_page' =>
  328. 'url' => '/[year:digital:4]/page/[page:digital]/',
  329. 'widget' => 'Widget_Archive',
  330. 'action' => 'render',
  331. ),
  332. 'archive_month_page' =>
  333. 'url' => '/[year:digital:4]/[month:digital:2]/page/[page:digital]/',
  334. 'widget' => 'Widget_Archive',
  335. 'action' => 'render',
  336. ),
  337. 'archive_day_page' =>
  338. 'url' => '/[year:digital:4]/[month:digital:2]/[day:digital:2]/page/[page:digital]/',
  339. 'widget' => 'Widget_Archive',
  340. 'action' => 'render',
  341. ),
  342. 'comment_page' =>
  343. 'url' => '[permalink:string]/comment-page-[commentPage:digital]',
  344. 'widget' => 'Widget_Archive',
  345. 'action' => 'render',
  346. ),
  347. 'feed' =>
  348. 'url' => '/feed[feed:string:0]',
  349. 'widget' => 'Widget_Archive',
  350. 'action' => 'feed',
  351. ),
  352. 'feedback' =>
  353. 'url' => '[permalink:string]/[type:alpha]',
  354. 'widget' => 'Widget_Feedback',
  355. 'action' => 'action',
  356. ),
  357. 'page' =>
  358. 'url' => '/[slug].html',
  359. 'widget' => 'Widget_Archive',
  360. 'action' => 'render',
  361. ),
  362. )

详解见下页:

已有 4 条评论 »

  1. numen numen

    学习了。感谢楼主。

  2. 恩。学习了。
    感谢分享经验。

  3. lee lee

    插件的代码64行 给没有指定语言的设置个默认值就好了 哈哈

    $language = trim($matches[2]) ? trim($matches[2]): 'html';

    1. 谢谢Lee,不用我再去看改该动哪个地方的代码了,已经解决$language = $matches[2] ? trim($matches[2]): 'html';
      看了你的两个设计(主题站和电影站)之后很是羡慕,有理论没有实践的我真是惭愧
      一直没对TE的数据库结构做扩展,以后多多向你学习!

添加新评论 »