Skip to content

控制器

控制器是你应用程序的核心,因为它们确定了如何处理 HTTP 请求。

什么是控制器

一个控制器简单来说就是处理 HTTP 请求的类文件。URI 路由 将一个 URI 与控制器关联起来,执行控制器中的方法。

你创建的每个控制器都应该扩展 Controller 类。 这个类为你所有的控制器提供了几个可用的功能。

控制器的命名

控制器命名应和类名一致,统一使用小写字母,当资源名称由多个单词组成时,使用下划线连接。

构造函数

控制器的构造函数是可选的。

如果你确实需要在控制器中做一些初始化工作,你可以创建一个 __construct() 构造函数,但不要忘记在方法中添加 parent::__construct()

php
<?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 格式的成功响应 ,响应结构为:

字段名类型描述示例
codeint状态码0
msgstring状态描述ok
dataany响应数据

error($code, $msg='',$data = null)

输出一个 json 格式的错误响应 ,响应结构为:

字段名类型描述示例
codeint状态码400001
msgstring状态描述没有访问权限
dataany响应数据用于前端调试的数据

redirect($url)

重定向到指定的 URL

rawOutput($httpCode, $data = null)

直接输出一个 http 响应 ,参数为:

字段名类型描述示例
httpCodeintHTTP 状态码200
dataany响应数据

注意

success()error()redirect()rawOutput() 方法不会结束程序,不再执行后续程序时需要使用 return 来结束。如:

php
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
<?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());
    }

}