请求拦截

EasySwoole 的控制器并没有提供类似中间件的说法,而是提供了控制器中的 onRequest 事件进行验证。

例如,我们需要对 /api/user/* 下的路径进行 cookie 验证。那么有以下两种方案:

全局 Request 及 Response 事件

全局 Initialize 事件 中注册.

  1. public static function initialize()
  2. {
  3. date_default_timezone_set('Asia/Shanghai');
  4. // onRequest v3.4.x+
  5. \EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) {
  6. $cookie = $request->getCookieParams('user_cookie');
  7. // 对 cookie 进行判断,比如在数据库或者是 redis 缓存中,存在该 cookie 信息,说明用户登录成功
  8. $isLogin = true;
  9. if ($isLogin) {
  10. // 返回 true 表示继续往下执行控制器 action
  11. return true;
  12. } else {
  13. // 这一步可以给前端响应数据,告知前端未登录
  14. $data = Array(
  15. "code" => 200,
  16. "result" => null,
  17. "msg" => '请先登录'
  18. );
  19. $response->withHeader('Content-Type', 'application/json;charset=utf-8');
  20. $response->withStatus(200);
  21. $response->write(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
  22. // 返回 false 表示不继续往下执行控制器 action
  23. return false;
  24. }
  25. });
  26. // afterRequest v3.4.x+
  27. \EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_AFTER_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) {
  28. });
  29. }

EasySwoole 3.4.x 版本之前:可在项目根目录的 EasySwooleEvent.php 中看到 onRequestafterRequest 方法。

定义 Base 控制器

  1. <?php
  2. namespace App\HttpController\Api\User;
  3. use EasySwoole\Http\AbstractInterface\Controller;
  4. abstract class Base extends Controller
  5. {
  6. protected function onRequest(?string $action): ?bool
  7. {
  8. $cookie = $this->request()->getCookieParams('user_cookie');
  9. // 对 cookie 进行判断,比如在数据库或者是 redis 缓存中,存在该 cookie 信息,说明用户登录成功
  10. $isLogin = true;
  11. if ($isLogin) {
  12. // 返回 true 表示继续往下执行控制器 action
  13. return true;
  14. } else {
  15. // 这一步可以给前端响应数据,告知前端未登录
  16. $this->writeJson(401, null, '请先登录');
  17. // 返回 false 表示不继续往下执行控制器 action
  18. return false;
  19. }
  20. }
  21. }

后续,只要 /api/user/* 路径下的控制器,都继承自 Base 控制器,都可以自动实现对 cookie 拦截了

行为权限校验也是如此,可以判断某个用户是否对该控制器的 action 或者请求路径有没有权限