3.2 中间件
- 创建中间件:所有的中间件都会被默认创建到app/Middlware目录下
php ./bin/hyperf.php gen:middleware Auth/UserTokenMiddleware
- 定义全局中间件:在config/autoload/middlewares.php下定义
<?php
return [
'http' => [
\App\Middleware\Auth\UserTokenMiddleware::class
],
];
- 定义局部中间件
- 在路由里定义:在config/routes.php
<?php
use Hyperf\HttpServer\Router\Router;
Router::addGroup('/api', function () {
Router::get('/test/{id}', 'App\Controller\IndexController@test');
}, [
['middleware' => [\App\Middleware\Auth\UserTokenMiddleware::class]]
]);
- 在控制器里定义:当路由的定时方式是注解的时候才可以实现
- @Middlewares:定义多个中间件,用{}包裹
- @Middleware:定义单个中间件
<?php
namespace App\Controller;
use Hyperf\HttpServer\Annotation\AutoController;
use Hyperf\HttpServer\Annotation\Middleware;
use Hyperf\HttpServer\Annotation\Middlewares;
/**
* @AutoController()
* @Middlewares({
@Middleware(\App\Middleware\Auth\UserTokenMiddleware::class)
* })
*/
class IndexController extends AbstractController
{
public function index()
{
$user = $this->request->input('user', 'Hyperf');
$method = $this->request->getMethod();
return [
'method' => $method,
'message' => "Hello {$user}.",
];
}
/**
* @AutoController()
* @Middlewares({
@Middleware(\App\Middleware\Auth\AllowedGetMiddleware::class)
* })
*/
public function test(int $id)
{
return $id;
}
}
- 多个中间件的执行顺序:全局中间件→类级别中间件→方法级别中间件
- 中间件的内容的编写
<?php
namespace App\Middleware\Auth;
use Hyperf\HttpServer\Contract\RequestInterface as Request;
use Hyperf\HttpServer\Contract\ResponseInterface as Response;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
class UserTokenMiddleware implements MiddlewareInterface
{
/**
* @var ContainerInterface
*/
protected $container;
/**
* @var Response
*/
protected $response;
/**
* @var $request
*/
protected $request;
public function __construct(ContainerInterface $container, Response $response, Request $request)
{
$this->container = $container;
$this->response = $response;
$this->request = $request;
}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// token验证
$checkToken = false;
if ($checkToken) { // 验证成功继续往下请求
return $handler->handle($request);
} else { // 验证失败直接返回json内容
return $this->response->json(
[
'code' => -1,
'data' => [
'error' => '中间里验证token无效,阻止继续向下执行',
],
]
);
}
}
}文档更新时间: 2021-09-24 15:11 作者:赵豪