安装

  1. composer require easyswoole/http-annotation

实现原理

注解控制器,完整命名空间为EasySwoole\HttpAnnotation\AnnotationController,是继承自 use EasySwoole\Http\AbstractInterface\Controller的子类。它重写了父类的__construct__exec方法,从而实现的注解支持。

__construct

在构造方法中。默认实例化了自带的注解解析器EasySwoole\HttpAnnotation\Annotation\Parser,并解析了当前class的注解标签。

__exec

该方法是承接Dispatcher与控制器实体逻辑的桥梁。在该方法中,注解控制器做了以下事情

  • 检查并执行成员变量注解逻辑
  • 检查onRequest函数注解参数并执行注解参数逻辑校验
  • 检查目的action所注解标签并进行参数校验与逻辑校验

基础例子

  1. namespace App\HttpController;
  2. use EasySwoole\EasySwoole\Trigger;
  3. use EasySwoole\HttpAnnotation\AnnotationController;
  4. use EasySwoole\HttpAnnotation\AnnotationTag\Param;
  5. use EasySwoole\HttpAnnotation\Exception\Annotation\ParamValidateError;
  6. class Index extends AnnotationController
  7. {
  8. /**
  9. * @Param(name="name",required="")
  10. * @Param(name="age",integer="")
  11. */
  12. function index()
  13. {
  14. $data = $this->request()->getRequestParam();
  15. $this->response()->write("your name is {$data['name']} and age {$data['age']}");
  16. }
  17. function onException(\Throwable $throwable): void
  18. {
  19. if($throwable instanceof ParamValidateError){
  20. $this->response()->withHeader('Content-type','text/html;charset=utf-8');
  21. $this->response()->write("字段【{$throwable->getValidate()->getError()->getField()}】校验错误");
  22. }else{
  23. Trigger::getInstance()->throwable($throwable);
  24. }
  25. }
  26. }

在以上代码中,会自动对nameage字段进行校验,当校验失败时,抛出一个异常,校验成功则进入action逻辑。具体请看参数注解章节。