中间件

IMI 框架遵循 PSR-7、PSR-15 标准,使用中间件来实现路由。

开发者也可以开发中间件类,对整个请求和响应过程进行自定义处理。

注意!最好不要在中间件中使用类属性,可能会造成冲突!

定义中间件

  1. use Imi\Bean\Annotation\Bean;
  2. use Psr\Http\Message\ResponseInterface;
  3. use Psr\Http\Message\ServerRequestInterface;
  4. use Psr\Http\Server\RequestHandlerInterface;
  5. use Psr\Http\Server\MiddlewareInterface;
  6. /**
  7. * @Bean
  8. */
  9. class TestMiddleware implements MiddlewareInterface
  10. {
  11. /**
  12. * 处理方法
  13. * @param ServerRequestInterface $request
  14. * @param RequestHandlerInterface $handler
  15. * @return ResponseInterface
  16. */
  17. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
  18. {
  19. // 前置处理
  20. // 先执行其它中间件
  21. $response = $handler->handle($request);
  22. // 后置处理
  23. return $response;
  24. }
  25. }

全局中间件

  1. return [
  2. 'beans' => [
  3. // 中间件
  4. 'HttpDispatcher' => [
  5. 'middlewares' => [
  6. // 中间件
  7. \Imi\Server\Session\Middleware\HttpSessionMiddleware::class,
  8. ],
  9. ],
  10. ],
  11. ];

局部中间件

注解使用

  1. class Index extends HttpController
  2. {
  3. /**
  4. * PHP 原生模版引擎演示
  5. * 访问:http://127.0.0.1:8080/
  6. *
  7. * @Action
  8. * @Route(url="/")
  9. * @View(template="index")
  10. *
  11. * 单个中间件,浏览器 F12 看Response Header:
  12. * @Middleware(\ImiDemo\HttpDemo\Middlewares\PoweredBy::class)
  13. * @return void
  14. */
  15. public function index()
  16. {
  17. return [
  18. 'title' => 'hello imi',
  19. 'content' => 'imi is very six',
  20. ];
  21. }
  22. /**
  23. * 无@View注解,不用写代码,也可以渲染模版
  24. * 访问:http://127.0.0.1:8080/Index/test
  25. *
  26. * @Action
  27. *
  28. * 多个中间件,浏览器 F12 看Response Header:
  29. * @Middleware({
  30. * \ImiDemo\HttpDemo\Middlewares\PoweredBy::class,
  31. * \ImiDemo\HttpDemo\Middlewares\Test::class
  32. * })
  33. *
  34. * @return void
  35. */
  36. public function test()
  37. {
  38. }
  39. }

如上代码,index()方法中的@Middleware是设置单个。test()方法中的是设置多个中间件。具体请看imi-demo项目代码。

配置路由使用

任何类型的路由配置都是加middlewares节来实现指定局部中间件。

  1. [
  2. 'route' => [
  3. 'url' => '/callback2',
  4. ],
  5. 'callback' => new RouteCallable('\Test', 'abc'),
  6. 'middlewares' => [
  7. \ImiDemo\HttpDemo\Middlewares\PoweredBy::class,
  8. ],
  9. ],