Filters¶

文件位置¶

  1. resource/middleware/middleware.php

功能¶

自定义请求的过滤处理函数

配置示例¶

tcp¶

  1. <?php
  2. return [
  3. 'match' => [
  4. // 可以单独针对 所有泛化调用 设置过滤器
  5. [
  6. "/com/Yourcompany/nova/framework/generic/service/GenericService/invoke", "genericServiceFilterGroup",
  7. ],
  8. // 也可以直接 针对特定服务配置, 在过滤器内检测是否是泛化调用
  9. [
  10. "/Com/Yourcompany/Nova/Framework/Generic/Php/Service/GenericTestService/ThrowException", "genericServiceFilterGroup",
  11. ],
  12. // 支持设置多个过滤器
  13. [
  14. "/com/Yourcompany/nova/framework/generic/service/GenericService/invoke", ["genericServiceFilterGroup", "another"],
  15. ],
  16. [
  17. ".*", "all"
  18. ]
  19. ],
  20. 'group' => [
  21. "genericServiceFilterGroup" => [
  22. genericServiceFilter::class
  23. ],
  24. "another" => [
  25. anotherFilter::class
  26. ],
  27. "all" => [
  28. genericServiceFilter::class
  29. ],
  30. ]
  31. ];
  • match用于服务分组,服务名称支持正则表达式匹配。
  • group设置分组名和对应的请求过滤器,请求过滤器需要实现接口ZanFrameworkContractNetworkRequestFilter,一个分组名可以设置多个处理器。
    请求过滤器的实现示例为:
  1. <?php
  2. use Zan\Framework\Contract\Network\RequestFilter;
  3.  
  4. class genericServiceFilter implements RequestFilter
  5. {
  6. /**
  7. * @param \Zan\Framework\Contract\Network\Request $request
  8. * @param \Zan\Framework\Utilities\DesignPattern\Context $context
  9. * @return \Zan\Framework\Contract\Network\Response
  10. */
  11. public function doFilter(\Zan\Framework\Contract\Network\Request $request, \Zan\Framework\Utilities\DesignPattern\Context $context)
  12. {
  13. if ($request instanceof \Zan\Framework\Network\Tcp\Request) {
  14. //判断是否为泛化调用的请求
  15. if ($request->isGenericInvoke()) {
  16. $route = $request->getRoute();
  17. $rpcCtx = $request->getRpcContext();
  18.  
  19. // 两种方式获取透传参数
  20. $id = $context->get("id", -1);
  21.  
  22. $id = $rpcCtx->get($id, 0);
  23. if ($id === 42) {
  24. // 抛出异常, 或者错误信息
  25. throw new \RuntimeException("invalid id", 500);
  26. //yield "invalid id";
  27. return;
  28. }
  29. }
  30. }
  31. yield null;
  32. }
  33.  
  34. }

doFilter对请求进行拦截处理,需要过滤掉的请求可以抛出异常信息或者yield返回响应消息,需要继续处理的请求yieldnull,或者直接return即可。

http¶

http配置内容与tcp类似,不同点在于tcp以服务名和方法名为key,http以url的path为key(path未指明默认为index/index/index)来匹配分组,http示例为:

  1. <?php
  2. use Zan\Framework\Network\Server\Middleware\TraceFilter;
  3.  
  4. return [
  5. 'group' => [
  6. 'all' => [
  7. TraceFilter::class
  8. ]
  9. ],
  10. 'match' => [
  11. ['market\/.*/', 'acl'],
  12. ['goods\/.*/', 'acl'],
  13. ['shop\/.*/', 'acl'],
  14. ['.*', 'all']
  15. ],
  16. ];

TraceFilter位于src/Network/Server/Middleware/TraceFilter.php文件。

自定义filter在框架filter之后执行

原文: http://zanphpdoc.zanphp.io/libs/middleware/filters.html