title: Easyswoole控制器 meta:

  • name: description content: easyswoole控制器使用说明
  • name: keywords content: swoole|swoole 拓展|swoole 框架|easyswoole|swoole api服务|swoole 控制器|swoole|swoole http

控制器对象

控制器对象是http组件中方便客户端与服务端交互的对象,它使用了对象池对象复用模式,以及注入requestresponse对象进行数据交互

对象池模式

http的控制器对象都采用了对象池模式进行获取创建对象.
例如:

  • 用户A请求/Index经过url解析以及路由转发,定位到了App\HttpController\Index.php控制器
  • 由于是第一次请求,new App\HttpController\Index.php并将该对象存入到对象池中
  • 对象池出列,获取该对象,并进行调用index方法进行处理请求
  • 处理完毕,将对象的public属性重置为默认值,对象回收对象池
  • 用户B请求/Index经过url解析以及路由转发,定位到了App\HttpController\Index.php控制器
  • 由于是二次请求,对象池直接获取到第一次的对象,不需要new,直接调用index方法进行处理

::: warning 对象池模式实现了不同请求复用同一个对象,降低了创建/销毁对象的开销,只有第一次请求创建对象才会调用构造函数,在第二次请求获取对象时将不会再次调用,对象池模式只会重置非静态public属性,其他属性将会复用,对象池模式是针对单一进程的,多个work进程的对象池不共享.
:::

约定规范

  • 项目中类名称与类文件(文件夹)命名,均为大驼峰,变量与类方法为小驼峰。
  • 在HTTP响应中,于业务逻辑代码中echo $var 并不会将$var内容输出至相应内容中,请调用Response实例中的wirte()方法实现。

对象方法

调度类方法

  • action

    action是控制器最终执行的方法,根据路由的匹配不同,从而执行不同的控制器方法,例如默认执行的index方法,例如访问ip/Index/test最终解析的test方法,都可以称作action执行方法.

::: warning action方法可以返回一个字符串,从而让框架再次进行控制器方法调度,例如:
:::

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Tioncico
  5. * Date: 2019/4/11 0011
  6. * Time: 14:40
  7. */
  8. namespace App\HttpController;
  9. use EasySwoole\EasySwoole\Trigger;
  10. use EasySwoole\Http\AbstractInterface\Controller;
  11. use EasySwoole\Http\Message\Status;
  12. class Index extends Controller
  13. {
  14. function index()
  15. {
  16. $this->writeJson(200, [], 'success');
  17. return '/test';
  18. }
  19. function test()
  20. {
  21. $this->response()->write('this is test');
  22. return '/test2';//当执行完test方法之后,返回/test2,让框架继续调度/test2方法
  23. }
  24. function test2()
  25. {
  26. $this->response()->write('this is test2');
  27. return true;
  28. }
  29. }

::: warning 返回的字符串将会被url解析规则以及route路由规则解析,但是需要注意,千万不能A方法返回B方法,B方法再返回A方法的字符串,否则会出现无限死循环调用 :::

  • onRequest
  1. protected function onRequest(?string $action): ?bool
  2. {
  3. return true;
  4. }

在准备调用控制器方法处理请求时的事件,如果该方法返回false则不继续往下执行.
可用于做控制器基类权限验证等,例如:

  1. function onRequest(?string $action): ?bool
  2. {
  3. if (parent::onRequest($action)) {
  4. //判断是否登录
  5. if (1/*伪代码*/) {
  6. $this->writeJson(Status::CODE_UNAUTHORIZED, '', '登入已过期');
  7. return false;
  8. }
  9. return true;
  10. }
  11. return false;
  12. }
  • afterAction
    当控制器方法执行结束之后将调用该方法,可自定义数据回收等逻辑

  • index
    index是一个抽象方法,代表着继承控制器对象的都需要实现该方法,index 将成为默认的控制器方法.

  • actionNotFound
    当请求方法未找到时,自动调用该方法,可自行覆盖该方法实现自己的逻辑

::: warning 该方法可以理解成 默认方法,类似于index方法,所以调用完之后也会触发afterAction,gc等方法 :::

  • onException
    当控制器逻辑抛出异常时将调用该方法进行处理异常(框架默认已经处理了异常)
    可覆盖该方法,进行自定义的异常处理,例如:
    1. function onException(\Throwable $throwable): void
    2. {
    3. //直接给前端响应500并输出系统繁忙
    4. $this->response()->withStatus(Status::CODE_INTERNAL_SERVER_ERROR);
    5. $this->response()->write('系统繁忙,请稍后再试 ');
    6. }

::: warning 更多控制器异常相关可查看错误与异常拦截 :::

  • gc
    1. protected function gc()
    2. {
    3. // TODO: Implement gc() method.
    4. if ($this->session instanceof SessionDriver) {
    5. $this->session->writeClose();
    6. $this->session = null;
    7. }
    8. //恢复默认值
    9. foreach ($this->defaultProperties as $property => $value) {
    10. $this->$property = $value;
    11. }
    12. }
    gc 方法将在执行方法,afterAction完之后自动调用
    将控制器属性重置为默认值,关闭session
    可自行覆盖实现其他的gc回收逻辑.

请求响应类方法

  • request
    request方法调用之后,将返回EasySwoole\Http\Request对象
    该对象附带了用户请求的所有数据,例如:
    1. function index()
    2. {
    3. $request = $this->request();
    4. $request->getRequestParam();//获取post/get数据,get覆盖post
    5. $request->getMethod();//获取请求方式(post/get/)
    6. $request->getCookieParams();//获取cookie参数
    7. }

::: warning 更多request相关可查看request对象 :::

  • response
    response方法将返回EasySwoole\Http\Response,用于向客户端响应数据,例如:
    1. function index()
    2. {
    3. $response = $this->response();
    4. $response->withStatus(200);//设置响应状态码,必须设置
    5. $response->setCookie('name','仙士可',time()+86400,'/');//设置一个cookie
    6. $response->write('hello world');//向客户端发送一条数据(类似于常规web模式的 echo )
    7. }

::: warning 更多response相关可查看response对象 :::

  • writeJson
    writeJson方法直接封装了设置响应状态码,设置响应头,数组转为json输出.
    1. function index()
    2. {
    3. $this->writeJson(200,['xsk'=>'仙士可'],'success');
    4. }
    网页输出:
    1. {"code":200,"result":{"xsk":"仙士可"},"msg":"success"}

反序列化方法

  • json
    使用json_decode 解析json字符串
  • xml
    使用simplexml_load_string解析xml字符串

session相关

  • sessionDriver
    设置session的驱动类,默认为EasySwoole\Http\Session\SessionDriver
  • session
    返回session的驱动类,进行管理session

验证相关

  • validate validate方法可直接调用EasySwoole\Validate\Validate对象的验证,返回验证成功/失败的结果,实现代码:
    1. protected function validate(Validate $validate)
    2. {
    3. return $validate->validate($this->request()->getRequestParam());
    4. }
    我们可使用该方法进行验证客户端发送的数据:
    1. function index()
    2. {
    3. $validate = new Validate();
    4. $validate->addColumn('name','姓名')->required()->lengthMax(50);
    5. //限制name必填并且不能大于50个字符串
    6. if (!$this->validate($validate)){
    7. $this->writeJson(400, [], $validate->getError()->__toString());
    8. return false;
    9. }
    10. $this->writeJson(200, [], 'success');
    11. }

::: warning 更多validate 相关可查看验证器 :::