控制器
控制器是你应用程序的核心,因为它们确定了如何处理 HTTP 请求。
什么是控制器
一个控制器简单来说就是处理 HTTP 请求的类文件。URI 路由 将一个 URI 与控制器关联起来,执行控制器中的方法。
你创建的每个控制器都应该扩展 Controller 类。 这个类为你所有的控制器提供了几个可用的功能。
控制器的命名
控制器命名应和类名一致,统一使用小写字母,当资源名称由多个单词组成时,使用下划线连接。
构造函数
控制器的构造函数是可选的。
如果你确实需要在控制器中做一些初始化工作,你可以创建一个 __construct() 构造函数,但不要忘记在方法中添加 parent::__construct()。
<?php
use framework\libraries\Controller;
class test extends Controller
{
function __construct()
{
parent::__construct();
//添加你的代码
}
}警告
我们建议你不要在控制器中使用构造函数,使用中间件的before()方法来对请求进行校验。
包含的方法
WeeSpeed 包含了一些属性,这些属性可以在控制器中使用。
请求对象
WeeSpeed 封装了 请求实例 的方法,你可以使用 $this 来访问请求对象的以下方法:
get($name, $default = null)
获得 query 参数,即从 $_GET 中获取参数。
参数:$name:参数名称 $default:默认值
返回值:提交的参数值或默认值,如果没有提交且没有默认值则返回 null
post($name, $default = null)
获得 post 参数,即从 $_POST 中获取参数。
参数:$name:参数名称 $default:默认值
返回值:提交的参数值或默认值,如果没有提交且没有默认值则返回 null
file($name)
获得上传的文件,即从 $_FILE 中获取参数。
参数:$name:参数名称
返回值:上传的文件对象,如果没有提交则返回 null
header($name, $default = null)
获得 header 中提交的参数
参数:$name:参数名称 $default:默认值
返回值:提交的参数值或默认值,如果没有提交且没有默认值则返回 null
server($name, $default = null)
获得 server ,即从 $\_SERVER 中获取参数。
参数:$name:参数名称 $default:默认值
返回值:提交的参数值或默认值,如果没有提交且没有默认值则返回 null
rawBody()
获得原始请求 post 包体。这在获取非 application/x-www-form-urlencoded 格式的 post 请求数据时很有用。
返回值:请求包体
data($name, $value)
添加一个数据到请求对象上,用于在控制器、中间件或其他方法中为同一请求传递参数。
参数:$name:参数名称 $value:默认值
返回值:无返回值
data($name)
读取请求对象中指定名称的数据
参数:$name:参数名称
返回值: 变量值,如果没有值则返回 null
响应对象
WeeSpeed 封装了 响应类 的方法,你可以使用$this来访问响应对象的以下方法:
success($data)
输出一个 json 格式的成功响应 ,响应结构为:
| 字段名 | 类型 | 描述 | 示例 |
|---|---|---|---|
| code | int | 状态码 | 0 |
| msg | string | 状态描述 | ok |
| data | any | 响应数据 |
error($code, $msg='',$data = null)
输出一个 json 格式的错误响应 ,响应结构为:
| 字段名 | 类型 | 描述 | 示例 |
|---|---|---|---|
| code | int | 状态码 | 400001 |
| msg | string | 状态描述 | 没有访问权限 |
| data | any | 响应数据 | 用于前端调试的数据 |
redirect($url)
重定向到指定的 URL
rawOutput($httpCode, $data = null)
直接输出一个 http 响应 ,参数为:
| 字段名 | 类型 | 描述 | 示例 |
|---|---|---|---|
| httpCode | int | HTTP 状态码 | 200 |
| data | any | 响应数据 |
注意
success()、error()、redirect()、rawOutput() 方法不会结束程序,不再执行后续程序时需要使用 return 来结束。如:
if ($res == 0) {
return $this->success($res);
} else {
return $this->error($code, $msg);
}辅助方法
getRealIp()
获得客户端真实 IP 地址
返回值: ip 地址字符串
isAjax()
判断请求是否为 Ajax 请求
返回值: true 或 false
示例
如我们要创建一个 /admin/users 接口,可以创建一个 controller/admin.php 文件,内容如下:
<?php
use framework\libraries\Controller;
class admin extends Controller
{
//获取用户列表
//GET: /admin/users?page=1
function users_get()
{
$page = $this->get('page', 1);
$where = [
'is_delete'=>0
];
$users = Db::select(
'user',
"*",
$where,
[],
[
'limit' => [$page,10]
]
);
return $this->success( $users);
}
//获取用户详情
//GET: /admin/users/{id}
function users_get($id)
{
$user = Db::get('user', "*",['id' => $id]);
//:TODO 检测用户是否存在
return $this->success($user);
}
//创建用户
//POST: /admin/users
function users_post()
{
//获取请求参数
$name = $this->post('name');
//省略其他参数和校验逻辑
$id=Db::insert('user',$data);
return $this->success($id);
}
//更新用户信息
//POST: /admin/users/{id}
function users_post($id)
{
//获取请求参数
$name = $this->post('name');
//省略其他参数和校验逻辑
$res=Db::table('user',$data,['id'=>$id]);
return $this->success($res->rowCount());
}
//删除用户
//DELETE: /admin/users/{id}
function users_delete($id)
{
//省略校验逻辑
$res=Db::delete('user',['id'=>$id]);
return $this->success($res->rowCount());
}
}