插件开发手册

中间件

最近更新:6个月前

中间件遵守标准的PSR规范!

中间件由\Ebcms\RequestHandler管理

支持如下方法:

  • middleware(MiddlewareInterface $middleware) 注册一个中间件
  • middlewares(array $middlewares) 注册多个中间件
  • prependMiddleware(MiddlewareInterface $middleware) 注册一个中间件(顶部追加)
  • lazyMiddleware(string $middleware) 注册一个中间件(字符串形式、命名空间形式)
  • lazyMiddlewares(array $middlewares) 注册多个中间件(字符串形式、命名空间形式)
  • lazyPrependMiddleware(string $middleware) 注册一个中间件(字符串形式、命名空间形式)(顶部追加)

前置中间件

前置中间件就是在获得响应之前进行条件判断返回其他响应,主要是用作拦截,比如权限认证、跳转等等

一个前置中间件的示例:

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class Auth implements MiddlewareInterface
{
    public function process(
        ServerRequestInterface $request,
        RequestHandlerInterface $handler
    ): ResponseInterface {
        if ('未登录') {
            // 在响应之前返回跳转
            return new JumpResponse('http://...', 302);
        }
        return $handler->handle($request);
    }
}

后置中间件

后置中间件主要是在获得响应后,对响应做变更,例如往响应的代码中注入代码,比如加入统计代码之类的。

一个后置中间件的示例:

use Ebcms\StreamFactory;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class RejectTongjiCode implements MiddlewareInterface
{

    public function process(
        ServerRequestInterface $request,
        RequestHandlerInterface $handler
    ): ResponseInterface {
        $response = $handler->handle($request);
        // 在响应之后,对响应注入其他代码
        $tongji_code = '<script>...</script>';
        $contents = str_replace('</body>', $tongji_code . '</body>', $response->getBody());
        return $response->withBody((new StreamFactory())->createStream($contents));
    }
}

前置中间件和后置中间件的代码区别就是前置是在$handler->handle($request)处理之前返回其他响应,后置是在获取$handler->handle($request)响应之后对响应做出处理

将中间件注入到系统

注入到系统中有很多方式,比如在钩子上注入,也可以在控制器中注入,也可以在路由上注入

通过钩子注入示例

// /hook/app.start/aaa.php
use Ebcms\App;
use Ebcms\RequestHandler;

App::getInstance()->execute(function (
    RequestHandler $requestHandler
) {
    $requestHandler->lazyMiddleware(SomeMiddleware::class);
});

在控制器中注入示例

use Ebcms\RequestHandler;

class Index
{
    public function __construct(
        RequestHandler $requestHandler
    ) {
        $requestHandler->lazyMiddleware(SomeMiddleware::class);
    }
}

通过路由注入

参考路由


Powered By EBCMS