只需要实现了 Swoft\Http\Server\Contract\MiddlewareInterface 接口均为一个合法的中间件,其中 process() 方法为该中间件逻辑处理方法。
配置全局中间件
...
'httpDispatcher'=>[
'middlewares'=>[
AuthMiddleware::class,
ApiMiddleware::class
]
]
...
]
通过 @Middleware
和 @Middlewares
, 可以很方便的配置中间件到当前的 Controller 和 Action 内
提前拦截请求
namespace App\Http\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Context\Context;
use Swoft\Http\Server\Contract\MiddlewareInterface;
/**
* @Bean()
*/
class SomeMiddleware implements MiddlewareInterface
/**
* Process an incoming server request.
* @param ServerRequestInterface $request
* @param RequestHandlerInterface $handler
* @return ResponseInterface
* @inheritdoc
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$path = $request->getUri()->getPath();
if ($path === '/favicon.ico') {
$response = Context::mustGet()->getResponse();
return $response->withStatus(404);
}
return $handler->handle($request);
}
}
用户JWT登陆验证
namespace App\Http\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Context\Context;
use Swoft\Http\Server\Contract\MiddlewareInterface;
/**
* @Bean()
{
/**
* Process an incoming server request.
* @param ServerRequestInterface $request
* @param RequestHandlerInterface $handler
* @return ResponseInterface
* @inheritdoc
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// before request handle
// 判断token
$token = $request->getHeaderLine("token");
$type = \config('jwt.type');
$public = \config('jwt.publicKey');
try {
$auth = JWT::decode($token, $public, ['type' => $type]);
$request->user = $auth->user;
} catch (\Exception $e) {
$json = ['code'=>0,'msg'=>'授权失败']
$response = Context::mustGet()->getResponse();
return $response->withData($json);
}
$response = $handler->handle($request);
return $response;
// after request handle
}