中间件 Middleware
只需要实现了 接口均为一个合法的中间件,其中 process()
方法为该中间件逻辑处理方法, 可以参考 Swoft
项目呢 app/Middlewares/
目录下的文件, 比如 app/Middlewares/ActionTestMiddleware
:
使用
// 全局中间件配置: app/config/beans/base.php
return [
...
'serverDispatcher' => [
'middlewares' => [
\Swoft\View\Middleware\ViewMiddleware::class,
\Swoft\Session\Middleware\SessionMiddleware::class,
]
],
...
];
通过 @Middleware
和 @Middlewares
, 可以很方便的配置中间件到当前的 Controller
和 Action
内
- 当将此注解应用于
Controller
上,则作用域为整个Controller
- 将此注解应用于
Action
上,则作用域仅为当前的Action
@Middleware
用于配置单个中间件@Middlewares
显而易见的是用于配置一组 ,按照定义顺序依次执行, 使用参考app/Controllers/MiddlewareController.php
构造一个新的 Response 对象直接返回
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
$auth = false;
// 如果验证不通过
if (!$auth) {
// response() 函数可以快速从 RequestContext 获得 Response 对象
return response()->withStatus(401);
}
// 委托给下一个中间件处理
$response = $handler->handle($request);
return $response;
}
抛出异常返回
只要在请求生命周期内抛出的异常会被 ErrorHandler
捕获并处理,中间件内抛出也是如此,这部分不属于中间件的内容,顾在此不多做阐述。
<?php
namespace App\Middlewares;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Swoft\Bean\Annotation\Bean;
use Swoft\Http\Message\Middleware\MiddlewareInterface;
/**
* @Bean()
*/
{
* Process an incoming server request and return a response, optionally delegating
* response creation to a handler.
*
* @param \Psr\Http\Message\ServerRequestInterface $request
* @param \Psr\Http\Server\RequestHandlerInterface $handler
* @return \Psr\Http\Message\ResponseInterface
* @throws \InvalidArgumentException
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if ('OPTIONS' === $request->getMethod()) {
return $this->configResponse(\response());
}
$response = $handler->handle($request);
return $this->configResponse($response);
}
private function configResponse(ResponseInterface $response)
{
return $response
->withHeader('Access-Control-Allow-Origin', 'http://mysite')
->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');