phossa2/middleware

此包已被废弃且不再维护。未建议替代包。

PHP 的另一个酷炫中间件运行库。

2.0.1 2016-09-24 09:06 UTC

This package is not auto-updated.

Last update: 2020-01-24 16:24:12 UTC


README

请使用 phoole/middleware 库代替

Build Status Code Quality Code Climate PHP 7 ready HHVM Latest Stable Version License

phossa2/middleware 是 PHP 的另一个酷炫中间件运行库。

它需要 PHP 5.4,支持 PHP 7.0+ 和 HHVM。它符合 PSR-1PSR-2PSR-3PSR-4PSR-7 以及提议的 PSR-5

为什么还需要另一个中间件运行器?

  • 它最初是为了成为一个兼容 PSR-15 的中间件运行器。但我们不喜欢 PSR-15 的单次遍历方法。因此,它变成了一个双遍历和 PSR-15 风格的库。

  • 采用了来自 woohoolabs/harmonycondition 的良好特性。但我们不认同它与分发器的紧密绑定。

  • 一些仅在此库中独特的酷炫特性。

安装

通过 composer 工具安装。

composer require "phossa2/middleware"

或者将以下行添加到您的 composer.json

{
    "require": {
       "phossa2/middleware": "2.*"
    }
}

特性

  • 能够使用大多数现有的双遍历中间件。

  • 能够将一个中间件队列(一组中间件)作为通用中间件用于另一个(或主)队列。

  • 能够根据 condition 条件有条件地执行一个中间件或子队列。

  • 能够进入子队列并在子队列完成后终止。

使用

创建中间件队列,然后处理所有中间件。

use Phossa2\Middleware\Queue;
use Zend\Diactoros\Response;
use Zend\Diactoros\ServerRequestFactory;

// create middleware queue
$mws = new Queue([
    new LoggerMiddleware(),
    new DispatcherMiddleware()
]);

// process the queue
$response = $mws->process(ServerRequestFactory::fromGlobals(), new Response());

或者在实例化后将其添加到队列中,

$mws = (new Queue())
    ->push(new LoggerMiddleware())
    ->push(new DispatcherMiddleware());

高级

  • 与 PSR-7 中间件的兼容性。

    支持以下签名的 PSR-7 双遍历中间件:

    use Psr\Http\Message\RequestInterface;
    use Psr\Http\Message\ResponseInterface;
    
    function (
        RequestInterface $request,
        ResponseInterface $response,
        callable $next
    ) : ResponseInterface {
        // ...
    }

    许多现有的中间件可以在不修改的情况下使用,例如 psr7-middlewares

  • 子队列

    Phossa2\Middleware\Queue 实现了 Phossa2\Middleware\Interfaces\MiddlewareInterface 接口,因此队列本身可以用作通用中间件。

    // subqueue
    $subQueue = new Queue([
        new ResponseTimeMiddleware(),
        new LoggingMiddleware(),
        // ...
    ]);
    
    // main middleware queue
    $mws = new Queue([
        $subQueue,
        new DispatcherMiddleware(),
        // ...
    ]);
    
    $response = $mws->process(ServerRequestFactory::fromGlobals(), new Response());
  • 条件使用

    一个 condition 是一个具有以下签名的可调用对象:

    function (RequestInterface $request, ResponseInterface $response) : bool
    {
        // ...
    }

    或者是一个 Phossa2\Middleware\Interfaces\ConditionInterface 的实例。

    条件可以附加到中间件或子队列。只有当条件评估为 TRUE 时,中间件才会执行。

    // add condition during instantiation
    $mws = new Queue([
        [$subQueue, new DebugTurnedOnCondition()],
        new DispatcherMiddleware(),
    ]);
    
    // or during the push
    $mws->push(new AuthMiddleware(), new PathPrefixCondition('/user'));
  • 子队列终止 - 分支

    有时,用户希望在子队列完成后立即终止整个中间件处理,而不是继续处理父队列。

    // use terminatable queue
    $tQueue = new TerminateQueue([...]);
    
    $mws = new Queue([
        [$tQueue, new SomeCondition()], // execute & terminate if condition true
        $mw2,
        $mw3,
        // ...
    ]);
    
    $response = $mws->process($request, $response);

变更日志

请参阅 CHANGELOG 获取更多信息。

测试

$ composer test

贡献

请参阅 CONTRIBUTE 获取更多信息。

依赖

  • PHP >= 5.4.0

  • phossa2/shared >= 2.0.21

  • 一个 PSR-7 HTTP 消息实现,例如 zend-diactoros

许可证

MIT 许可证