Hyperf 初体验-中间件
- 2019 年 12 月 17 日
- 筆記
何为中间件
中间件主要用于编织从 请求(Request) 到 响应(Response) 的整个流程
程序员吐槽大会来解释中间件: 中间件就是,比如说马老师特别忙,每天很多人要见马老师,马老师不可能每个人都接待,很忙又不安全,这时候指定水彧来接待。所有人想找马老师都得先找水彧,马老师只跟水彧对接。这就是美曰其名的中间件。就是时代好了,以前这就叫太监…
生成中间件
php ./bin/hyperf.php gen:middleware Auth/FooMiddleware
将会生成
appMiddlewareAuthFooMiddleware
中间件
使用中间件
我们拿官网的实例代码来测试.
<?php declare(strict_types=1); namespace AppMiddlewareAuth; use HyperfHttpServerContractRequestInterface; use HyperfHttpServerContractResponseInterface as HttpResponse; use PsrContainerContainerInterface; use PsrHttpMessageResponseInterface; use PsrHttpMessageServerRequestInterface; use PsrHttpServerMiddlewareInterface; use PsrHttpServerRequestHandlerInterface; class FooMiddleware implements MiddlewareInterface { /** * @var ContainerInterface */ protected $container; /** * @var RequestInterface */ protected $request; /** * @var HttpResponse */ protected $response; public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request) { $this->container = $container; $this->response = $response; $this->request = $request; } public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { // 根据具体业务判断逻辑走向,这里假设用户携带的token有效 $isValidToken = false; if ($isValidToken) { return $handler->handle($request); } return $this->response->json( [ 'code' => -1, 'data' => [ 'error' => '中间里验证token无效,阻止继续向下执行', ], ] ); } }
分为全局中间件和局部中间件
全局中间件
全局中间件只可通过配置文件的方式来配置,配置文件位于 config/autoload/middlewares.php
,配置如下:
<?php return [ // http 对应 config/autoload/server.php 内每个 server 的 name 属性对应的值,该配置仅应用在该 Server 中 'http' => [ // 数组内配置您的全局中间件,顺序根据该数组的顺序 YourMiddleware::class ], ];
局部中间件
局部中间件可以通过配置文件或者注解定义
<?php use AppMiddlewareFooMiddleware; use HyperfHttpServerRouterRouter; // 每个路由定义方法都可接收一个 $options 参数 Router::get('/', [AppControllerIndexController::class, 'index'], ['middleware' => [ForMiddleware::class]]); Router::post('/', [AppControllerIndexController::class, 'index'], ['middleware' => [ForMiddleware::class]]); Router::put('/', [AppControllerIndexController::class, 'index'], ['middleware' => [ForMiddleware::class]]); Router::patch('/', [AppControllerIndexController::class, 'index'], ['middleware' => [ForMiddleware::class]]); Router::delete('/', [AppControllerIndexController::class, 'index'], ['middleware' => [ForMiddleware::class]]); Router::head('/', [AppControllerIndexController::class, 'index'], ['middleware' => [ForMiddleware::class]]); Router::addRoute(['GET', 'POST', 'HEAD'], '/index', [AppControllerIndexController::class, 'index'], ['middleware' => [ForMiddleware::class]]); // 该 Group 下的所有路由都将应用配置的中间件 Router::addGroup( '/v2', function () { Router::get('/index', [AppControllerIndexController::class, 'index']); }, ['middleware' => [ForMiddleware::class]] );
通过注解定义
定义单个中间件
<?php use AppMiddlewareFooMiddleware; use HyperfHttpServerAnnotationAutoController; use HyperfHttpServerAnnotationMiddleware; /** * @AutoController() * @Middleware(FooMiddleware::class) */ class IndexController { public function index() { return 'Hello Hyperf.'; } }
定义多个中间件
<?php use AppMiddlewareBarMiddleware; use AppMiddlewareFooMiddleware; use HyperfHttpServerAnnotationAutoController; use HyperfHttpServerAnnotationMiddleware; /** * @AutoController() * @Middlewares({ * @Middleware(FooMiddleware::class), * @Middleware(BarMiddleware::class) * }) */ class IndexController { public function index() { return 'Hello Hyperf.'; } }
定义方法级别中间件
<?php use AppMiddlewareBarMiddleware; use AppMiddlewareFooMiddleware; use HyperfHttpServerAnnotationAutoController; use HyperfHttpServerAnnotationMiddleware; use HyperfHttpServerAnnotationMiddlewares; /** * @AutoController() * @Middlewares({ * @Middleware(FooMiddleware::class) * }) */ class IndexController { /** * @Middlewares({ * @Middleware(BarMiddleware::class) * }) */ public function index() { return 'Hello Hyperf.'; } }
测试中间件
我们通过配置文件路由的方式来定义局部中间件 configroute.php
<?php declare(strict_types=1); use AppMiddlewareAuthFooMiddleware; use HyperfHttpServerRouterRouter; Router::get('/', [AppControllerIndexController::class, 'index'], ['middleware' => [FooMiddleware::class]]);
然后访问路由

测试注解定义中间件
<?php namespace AppController; use HyperfHttpServerAnnotationAutoController; use HyperfHttpServerAnnotationMiddleware; use AppMiddlewareAuthFooMiddleware; /** * @AutoController() * @Middleware(FooMiddleware::class) */ class IndexController extends Controller { public function index() { return 'Hello Hyperf'; } }

注意必须引入中间件所在的命名空间
测试全局中间件 编辑 config/autoload/middlewares.php
文件
<?php declare(strict_types=1); use AppMiddlewareAuthFooMiddleware; return [ 'http' => [ FooMiddleware::class, ], ];
我们将控制器 通过注解定义的中间件删掉,然后重启,可以看到局部中间件也没有问题。

ok,以上就是走了一遍文档上的中间件,更多用法请参考 官方文档
(adsbygoogle = window.adsbygoogle || []).push({});