Blogger Information
Blog 12
fans 0
comment 0
visits 8821
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 基于 SW-X 框架,搭建高性能API架构(四)
广州PHP
Original
563 people have browsed it

前言

官网地址:SW-X框架-专注高性能便捷开发而生的PHP-SwooleX框架

希望各大佬举起小手,给小弟一个star:https://github.com/swoolex/swoolex

1、什么是中间件

中间件属于AOP切面编程的衍生,SW-X中的中间件可以通过绑定路由地址,实现控制器无切入的关联绑定。

在中间件中,可以进行请求拦截(前置操作)、或者请求缓存销毁(后置操作)等业务。

2、通过路由绑定中间件

接回上章案例,我们现在要对/api/*前缀的所有接口,统一绑定一个名为Auth的中间件。

需要先再/config/middleware.php中间件配置文件中注册绑定规则:

  1. <?php
  2. return [
  3. // 匹配中间件,路由前半段是/api/开头的都会绑定到
  4. '/api/*' => [
  5. \box\middleware\Auth::class,
  6. ],
  7. ];

所有中间件不强制继承\x\Middleware基类,但一般建议继承,\x\Middleware类提供了一个error()方法,当开发者想中断应用继续向下执行时,可以调用该方法,抛出自定义的提示内容到客户端,该方法兼容了框架中4种不同的服务。

中间件建议(但不强制)统一存放在/box/middleware目录下, 便于项目管理。

接下来,我们在/box/middleware/目录下,创建一个Auth.php类,并写入代码:

  1. <?php
  2. /**
  3. * +----------------------------------------------------------------------
  4. * 权限中间件
  5. * +----------------------------------------------------------------------
  6. * 官网:https://www.sw-x.cn
  7. * +----------------------------------------------------------------------
  8. * 作者:小黄牛 <1731223728@qq.com>
  9. * +----------------------------------------------------------------------
  10. * 开源协议:http://www.apache.org/licenses/LICENSE-2.0
  11. * +----------------------------------------------------------------------
  12. */
  13. namespace box\middleware;
  14. use x\Middleware;
  15. use x\Restful;
  16. class Auth extends Middleware{
  17. // 需要跳过的路由
  18. private $_skip = [
  19. 'shop/delete',
  20. ];
  21. // 需要跳过的前置路由
  22. private $_group_skip = [
  23. 'login/',
  24. ];
  25. /**
  26. * 前置操作
  27. * @todo 无
  28. * @author 小黄牛
  29. * @version v2.5.0 + 2021.07.20
  30. * @deprecated 暂不启用
  31. * @global 无
  32. * @return void
  33. */
  34. public function handle() {
  35. // 获得当前路由地址
  36. $route = \x\Config::get('route');
  37. $url = str_replace($route['suffix'], '', ltrim(\x\Request::url(), $route['cutting']));
  38. $url = substr_replace($url, '', 0, (strpos($url, $route['cutting'])+1));
  39. // 跳过校验
  40. if (in_array($url, $this->_skip)) {
  41. return true;
  42. }
  43. // 跳过校验
  44. foreach ($this->_group_skip as $v) {
  45. if (stripos($url, $v) === 0) {
  46. return true;
  47. }
  48. }
  49. // 通过上下文,获得请求实例
  50. $Request = \x\context\Request::get();
  51. $get = $Request->get;// get表单
  52. $post = $Request->post;// post表单
  53. $header = $Request->header;// post表单
  54. // 没有访问权限
  55. if (!isset($get['test'])) {
  56. Restful::code(Restful::ACTION_ERROR())->callback();
  57. // 返回false表示中断执行
  58. return false;
  59. }
  60. // 返回true表示继续向下执行
  61. return true;
  62. }
  63. }

同时,由于上面我们使用了一个ACTION_ERROR状态码,所以要在Restful状态码文件中加入响应的配置。

/restful/default/code.php修改成如下代码:

  1. <?php
  2. return [
  3. 'ERROR' => 0, // 默认失败状态码
  4. 'SUCCESS' => 1, // 默认成功状态码
  5. 'ACTION_ERROR' => 40001, // 默认成功状态码
  6. ];

/restful/default/msg.php修改成如下代码:

  1. <?php
  2. return [
  3. // 默认错误状态码对应的tips
  4. 'ERROR' => [
  5. 'default' => '请求失败', // 默认值
  6. ],
  7. // 默认成功状态码对应的tips
  8. 'SUCCESS' => [
  9. 'default' => '请求成功', // 默认值
  10. 'test' => '测试msg',
  11. ],
  12. // 权限校验失败
  13. 'ACTION_ERROR' => [
  14. 'default' => '权限校验失败', // 默认值
  15. ],
  16. ];

这时候我们访问http://IP地址:端口/api/shop/select接口,就会看到框架抛出了下面的状态码:

  1. {
  2. "code": 40001,
  3. "msg": "权限校验失败",
  4. "data": []
  5. }

如果访问http://IP地址:端口/api/shop/select?test=就是通过的。

同时,我们还可以创建/app/http/v1_0_1/controller/shop/delete.php/app/http/v1_0_1/controller/login/send.php接口,来查看中间件判断是否能够正常跳过。

/app/http/v1_0_1/controller/shop/delete.php代码如下:

  1. <?php
  2. namespace app\http\v1_0_1\controller\shop;
  3. use x\controller\Http;
  4. // 引入Restful组件
  5. use x\Restful;
  6. class delete extends Http
  7. {
  8. public function index() {
  9. // Restful组件抛出接口响应
  10. return Restful::code(Restful::SUCCESS())->data([
  11. 'title' => '我是api/shop/delete,跳过了中间件校验',
  12. ])->callback();
  13. }
  14. }

/app/http/v1_0_1/controller/login/send.php代码如下:

  1. <?php
  2. namespace app\http\v1_0_1\controller\login;
  3. use x\controller\Http;
  4. // 引入Restful组件
  5. use x\Restful;
  6. class send extends Http
  7. {
  8. public function index() {
  9. // Restful组件抛出接口响应
  10. return Restful::code(Restful::SUCCESS())->data([
  11. 'title' => '我是api/login/send,跳过了中间件校验',
  12. ])->callback();
  13. }
  14. }

创建完成后,就可以通过下列地址查看测试效果了:

  1. http://IP地址:端口/api/shop/delete
  2. http://IP地址:端口/api/login/send
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post