路由(Routing)是博客系统中将URL地址映射到具体处理逻辑的机制,它决定了当用户访问某个网址时,系统应该执行什么操作、显示什么内容。typecho站点一般都会开启伪静态,伪静态通过URL重写将"漂亮"的URL映射到实际的文件路径,但也带来了一个问题,开启后,服务器会拦截对物理路径的直接访问。这个时候我们就需要使用typecho中的路由,去告诉服务器,当用户扔过来这样一个路径时,应当如何应对。
路由的基本概念
在博客系统中,路由主要完成以下工作:
解析用户请求的URL
确定对应的处理程序(控制器/方法)
提取URL中的参数
返回适当的响应(HTML页面、JSON数据等)
Typecho 的路由
Typecho 的路由系统中,Request 和 Response 是处理 HTTP 请求和响应的两个核心对象。以下是它们的常用函数:
Request
Request 对象常用方法:
获取请求信息
getServer($key, $default = null) - 获取 $_SERVER 变量
getParam($key, $default = null) - 获取请求参数(GET/POST)
getQuery($key, $default = null) - 获取 GET 参数
getPost($key, $default = null) - 获取 POST 参数
getRequestUri() - 获取请求 URI
getPathInfo() - 获取路径信息
getMethod() - 获取请求方法(GET/POST等)
isGet() - 是否是 GET 请求
isPost() - 是否是 POST 请求
isPut() - 是否是 PUT 请求
isAjax() - 是否是 AJAX 请求
isSecure() - 是否是 HTTPS 请求
getIp() - 获取客户端 IP
其他功能
setParam($key, $value) - 设置请求参数
getCookie($key, $default = null) - 获取 Cookie
getFiles($key) - 获取上传文件
Response
Response 对象常用方法:
响应设置
setStatus($code) - 设置 HTTP 状态码
setContentType($contentType, $charset = 'UTF-8') - 设置内容类型
setHeader($name, $value, $replace = true) - 设置响应头
redirect($location, $isPermanently = false) - 重定向
内容输出
write($content) - 写入响应内容
clearBody() - 清空响应内容
getBody() - 获取响应内容
send() - 发送响应
使用示例
// 在路由处理中使用示例
public function action()
{
$request = $this->request;
$response = $this->response;
// 获取请求参数
$id = $request->getParam('id', 0);
// 检查请求方法
if ($request->isPost()) {
// 处理POST请求
$title = $request->getPost('title');
// 设置响应
$response->setContentType('application/json');
$response->write(json_encode(['status' => 'success']));
} else {
// 重定向
$response->redirect('/error');
}
return $response;
}
这些函数提供了处理 HTTP 请求和响应的基本功能,是 Typecho 路由开发中的核心工具。
应用案例
需要注意的是,如果在本地测试没有开启伪静态的情况下,我们的测试地址后面需要先添加index.php
,问就是博主卡这里卡一整整一天。
//错误的访问方式
http://localhost/api/getnews
//正确的访问方式
http://localhost/index.php/api/getnews
实现一个站点sitemap的路由,当用户访问xml文件的时候利用sitemap.php
来即时生成:
function themeInit($self){
if (strpos($self->request->getRequestUri(), 'sitemap.xml') !== false) {
$self->response->setStatus(200);
$self->setThemeFile("sitemap.php");
}
}
一个外部获取信息的php文件,通过访问“/api/getnews”这个后缀来执行:
function themeInit($self){
if ($self->request->getPathInfo() == "/api/getnews") {
$self->response->setStatus(200);
$self->setThemeFile("api/api-get-news.php");
}
}
关于 themeInit
需要注意上方代码中的 themeInit ,它是 Typecho 主题开发中一个非常重要的函数,它允许开发者在主题加载时执行一些初始化操作。这是一个特殊的回调函数,当 Typecho 加载主题时会自动调用它,这个函数需要定义在主题的 functions.php 文件中。所以写路由规则的时候,这个名称是需要严格遵守的。