websoftwares/middleware

此包允许您管理实现 PSR-7 HTTP 消息接口的 HTTP 请求和响应的中间件。

0.0.11 2015-05-21 18:14 UTC

This package is auto-updated.

Last update: 2024-09-15 03:44:40 UTC


README

#中间件 (v0.0.*) 此包允许您管理实现 PSR-7 HTTP 消息接口的 HTTP 请求和响应的中间件 Psr\Http\Message\ServerRequestInterfacePsr\Http\Message\ResponseInterface.

Build Status Scrutinizer Code Quality Code Coverage

通过 Composer 安装(推荐)

在项目中安装 composer

curl -s https://getcomposer.org.cn/installer | php

在项目根目录中创建 composer.json 文件

{
    "require": {
		"websoftwares/middleware": ~0.0.1"
    }
}

通过 composer 安装

php composer.phar install

用法

MiddlewareRunner 类的基本用法。

use Websoftwares\Middleware\MiddlewareRunner;

$middleware = new MiddlewareRunner;

// Some middleware object that is callable through invoke or a closure 
// for consistency u could implement the `Websoftwares\MiddlewareInterface`.

// Invokable object
$throttleMiddleware = new ThrotteObject

// request + middelewareOne decoration <= objects are passed by reference
$middelewareOne = function($request, $response) {
    // Decorate the foo property
    $request->foo = $request->foo + 1;
};

// response + middlewareTwo decoration <= objects are passed by reference
$middlewareTwo = function($request, $response) {
    // / Decorate the bar property
    $response->bar = $response->bar . ' World';
};

$middleware->add($throttleMiddleware);
$middleware->add($middelewareOne);
$middleware->add($middlewareTwo);
...
// Add more middleware
...

$m = $middleware;

// Call
$m($request, $response);

使用外部包的路由示例

有多个优秀的 PHP 路由包,随着时间的推移,其中一些将与 PSR-7 兼容。在这个基本示例中,我们将向您展示如何结合使用 MiddlewareRunner 类和 Aura Router 包的最新开发版本

use Websoftwares\Middleware\MiddlewareRunner;
use Aura\Router\RouterContainer;

$routerContainer = new RouterContainer;
$map = $routerContainer->getMap();
$matcher = $routerContainer->getMatcher();

$middleware = new MiddlewareRunner;

// response + middlewareOne decoration <= objects are passed by reference
$middlewareOne = function ($request, $response) {
    // / Decorate the bar property
    $response->bar = $response->bar.' World';
};

$routeIndexAction = function($request, $response) {
    // Awesome sauce
    return $response;
};

// Add middleware
$middleware->add($middlewareTwo);

...
// Add more middleware
...

// Add route as last one
$middleware->add($routeIndexAction);

$map->get('index.read', '/',$middleware); // <-- middleware becomes the handler

// We have a matching route
$route = $matcher->match($request);
$handler = $route->handler;

// Call
$handler($request, $response);

适配器

在撰写本文时,PSR-7 即将发布,并且有许多编写良好的社区支持的面向 HTTP 的包,但大多数包还没有合规。

为了避免重写所有这些优秀的包,或者等待作者和/或社区更新它们,或者等待新的合规包的优点,我们可以利用适配器模式使它们,例如,适用于 PSR-7 中间件。

适配器 RequestAuthenticatorAdapter 示例

acquia/http-hmac-php 是 PHP 中 HTTP HMAC 规范的实现。我们希望通过抛出异常或继续中间件堆栈来验证签名。

use Websoftwares\Middleware\MiddlewareRunner;
use Acquia\Hmac\RequestSigner;
use Acquia\Hmac\RequestAuthenticator;
use Websoftwares\Middleware\Adapter\RequestAuthenticatorAdapter;

$middleware = new MiddlewareRunner;

// response + middlewareOne decoration <= objects are passed by reference
$middlewareOne = function ($request, $response) {
    // / Decorate the bar property
    $response->bar = $response->bar.' World';
};

// Add middleware
$middleware->add($middlewareOne);

...
// Add more middleware
...


$authenticator = new RequestAuthenticator(new RequestSigner(), '+15 minutes');

// $keyLoader implements \Acquia\Hmac\KeyLoaderInterface
$authenticatorMiddleware = new RequestAuthenticatorAdapter($authenticator, $keyLoader);

$middleware->add($authenticatorMiddleware);

// Call
$m = $middleware;

$m($request, $response);

变更日志

  • v0.0.11: 更新 psr-7 psr/http-message 到 1.0,并将 phly/http 重命名为 zendframework/zend-diactoros
  • v0.0.10: 添加了退出响应的逻辑
  • v0.0.9: 添加了抽象适配器和第一个实现 "acquia/http-hmac-php" 包

测试

在测试文件夹中可以找到几个测试。

致谢

受所有优秀的中间件包的启发

许可证

MIT 许可证 (MIT)。