onRequest 事件(即收到请求事件)

使用场景及原理

EasySwoole 收到任何的 HTTP 请求时,均会执行该事件。可以使用该事件可以对 HTTP 请求全局拦截,包括对请求进行允许跨域等操作。

使用方式说明

框架对 onRequest 事件的实现在 3.4.x 及以后的版本 中做了新的改动,实现方式由原来旧版本在主服务创建事件(mainServerCreate 事件)中定义改变为在 initialize 事件 中使用 Di 方式注入。目前最新稳定版本框架(3.4.x),具体实现及使用方式 (在 EasySwooleEvent.php 中的 initialize 事件中注入) 如下:

  1. <?php
  2. namespace EasySwoole\EasySwoole;
  3. use EasySwoole\EasySwoole\AbstractInterface\Event;
  4. use EasySwoole\EasySwoole\Swoole\EventRegister;
  5. class EasySwooleEvent implements Event
  6. {
  7. public static function initialize()
  8. {
  9. date_default_timezone_set('Asia/Shanghai');
  10. // 实现 onRequest 事件
  11. \EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response): bool {
  12. ###### 对请求进行拦截 ######
  13. // 不建议在这拦截请求,可增加一个控制器基类进行拦截
  14. // 如果真要拦截,判断之后 return false; 即可
  15. /*
  16. $code = $request->getRequestParam('code');
  17. if (0){ // empty($code)验证失败
  18. $data = array(
  19. "code" => \EasySwoole\Http\Message\Status::CODE_BAD_REQUEST,
  20. "result" => [],
  21. "msg" => '验证失败'
  22. );
  23. $response->write(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
  24. $response->withHeader('Content-type', 'application/json;charset=utf-8');
  25. $response->withStatus(\EasySwoole\Http\Message\Status::CODE_BAD_REQUEST);
  26. return false;
  27. }
  28. return true;
  29. */
  30. ###### 处理请求的跨域问题 ######
  31. $response->withHeader('Access-Control-Allow-Origin', '*');
  32. $response->withHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  33. $response->withHeader('Access-Control-Allow-Credentials', 'true');
  34. $response->withHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
  35. if ($request->getMethod() === 'OPTIONS') {
  36. $response->withStatus(\EasySwoole\Http\Message\Status::CODE_OK);
  37. return false;
  38. }
  39. return true;
  40. });
  41. }
  42. public static function mainServerCreate(EventRegister $register)
  43. {
  44. }
  45. }

旧版本(3.4.x 之前版本)框架的 onRequest 事件的实现如下所示:

  1. <?php
  2. namespace EasySwoole\EasySwoole;
  3. use EasySwoole\EasySwoole\Swoole\EventRegister;
  4. use EasySwoole\EasySwoole\AbstractInterface\Event;
  5. use EasySwoole\Http\Request;
  6. use EasySwoole\Http\Response;
  7. class EasySwooleEvent implements Event
  8. {
  9. public static function initialize()
  10. {
  11. // TODO: Implement initialize() method.
  12. date_default_timezone_set('Asia/Shanghai');
  13. }
  14. public static function mainServerCreate(EventRegister $register)
  15. {
  16. }
  17. // 注册 onRequest 事件回调
  18. public static function onRequest(Request $request, Response $response): bool
  19. {
  20. ###### 对请求进行拦截 ######
  21. // 不建议在这拦截请求,可增加一个控制器基类进行拦截
  22. // 如果真要拦截,判断之后 return false; 即可
  23. /*
  24. $code = $request->getRequestParam('code');
  25. if (0){ // empty($code)验证失败
  26. $data = array(
  27. "code" => \EasySwoole\Http\Message\Status::CODE_BAD_REQUEST,
  28. "result" => [],
  29. "msg" => '验证失败'
  30. );
  31. $response->write(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
  32. $response->withHeader('Content-type', 'application/json;charset=utf-8');
  33. $response->withStatus(\EasySwoole\Http\Message\Status::CODE_BAD_REQUEST);
  34. return false;
  35. }
  36. return true;
  37. */
  38. ###### 处理请求的跨域问题 ######
  39. $response->withHeader('Access-Control-Allow-Origin', '*');
  40. $response->withHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  41. $response->withHeader('Access-Control-Allow-Credentials', 'true');
  42. $response->withHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
  43. if ($request->getMethod() === 'OPTIONS') {
  44. $response->withStatus(\EasySwoole\Http\Message\Status::CODE_OK);
  45. return false;
  46. }
  47. return true;
  48. }
  49. }

注意事项

若在该事件中,执行 $response->end(),则该次请求不会进入路由匹配阶段。