alexpts/php-simple-middlewares

与PSR-7兼容的简单中间件管理器

1.1.0 2017-06-12 09:05 UTC

This package is auto-updated.

Last update: 2024-09-15 02:24:36 UTC


README

SensioLabsInsight

Build Status Test Coverage Code Climate Scrutinizer Code Quality

新的PSR-15兼容中间件管理器

(已弃用) 与PSR-7兼容的简单中间件

MiddlewaresManager 允许配置软件中间件执行的顺序。每个中间件接收一个 $request 请求对象作为输入,可以选择对其进行操作或创建一个新的 $request 对象并将其传递给下一个中间件,等待其返回一个响应对象。然后它可以对响应对象进行操作,或者简单地将其传递给上一个中间件。

中间件可以选择不调用下一个中间件,而是将结果返回给先前的中间件。也就是说,每个中间件会得到两次控制权。在 $request 对象传递时和 $response 对象返回时。

为了确保组件的灵活性和可集成性,中间件处理器不受任何接口的限制。处理器可以是任何可调用的类型,它将接收两个参数 ServerRequestInterface $requestcallable $next。为了更正式的开发,每个处理器都可以支持正式的接口 MiddlewareInterface

返回的 $response 对象的类型也没有任何限制。您可以从处理器返回任何类型,例如数组或类型为 ResponseInterface (psr-7) 的对象。您可以正式地限制返回值的类型,通过在 PHP 7 中指定返回值的类型。

安装

$ composer require alexpts/php-simple-middlewares

示例

任意处理器

use Psr\Http\Message\ServerRequestInterface;
use PTS\Middleware\MiddlewareManager;

$middlewareManager = new MiddlewareManager();
$middlewareManager->push(function($request, $next){
    /* optionally modify the request */
    $request = $request->...;
	
    /* optionally skip the $next middleware and return early */
    if (...) {
        return $response;
    }
	
    /* optionally invoke the $next middleware and get back a new response */
    $response = $next($request);
	
    /* optionally modify the Response if desired */
    $response = $response->...;
	
    return $response;
});

多个 MiddlewareInterface 处理器

use Psr\Http\Message\ServerRequestInterface;
use PTS\Middleware\MiddlewareManager;
use PTS\Middleware\MiddlewareInterface;

class MiddlewareA implements MiddlewareInterface
{
    public function __invoke(ServerRequestInterface $request, callable $next)
    {
        $method = $request->getMethod();
        if (method !== 'GET') {
            return new JsonResponse(['status' => 405], 405);
        }

        $response = $next($request);
        /* optionally modify the Response if desired */
        $response = $response->...;

        return $response;
    }
}

class FrontController implements MiddlewareInterface
{
    public function __invoke(ServerRequestInterface $request, callable $next)
    {
        /* ... some work and create response */	
        return $response;
    }
}

$middlewareManager = new MiddlewareManager();
$middlewareManager->push(new MiddlewareA);
$middlewareManager->push(new FrontController);

/* ... PSR-7 $request */
$response = $middlewareManager($request);

错误/异常处理器

如果将中间件视为独立的应用程序,则每个处理器在出现错误或异常时必须返回一个PSR-7响应。这样的响应应按相反顺序遍历整个中间件链。

$middlewareManager = new MiddlewareManager();
$middlewareManager->push(new MiddlewareA);
$middlewareManager->push(new FrontController, function (\Throwable $ex) {
    return new JsonResponse(['error' => $ex->getMessage()], 500);
});

$response = $middlewareManager($request);