bittyphp/middleware

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

PSR-15 HTTP 中间件实现。

维护者

详细信息

github.com/bittyphp/middleware

此包尚未发布任何版本,且可用的信息很少。


README

Build Status Codacy Badge PHPStan Enabled Mutation Score Total Downloads License

Bitty 包含一个 PSR-15 中间件实现。

安装

最好使用 Composer 进行安装。

$ composer require bittyphp/middleware

官方中间件

Bitty 只包含满足最基本需求的中间件。然而,通过使用 MiddlewareInterface,您可以构建对几乎所有可以想到的内容的支持。

基本用法

要在 Bitty 之外使用 Bitty 的中间件,设置相当简单。每个调用的详细信息将在稍后解释。

<?php

use Bitty\Middleware\MiddlewareChain;

// Create a middleware chain.
$middleware = new MiddlewareChain();

// Optional: Override the default handler.
$middleware->setDefaultHandler(...);

// Optional: Add your custom middleware.
$middleware->add(...);
$middleware->add(...);
$middleware->add(...);

// Process the request.
$response = $middleware->handle($request);

默认处理器

默认处理器是在没有其他东西处理请求时被调用的。它必须是 Psr\Http\Server\RequestHandlerInterface 的一个实例。默认情况下,这只是一个返回 404 未找到响应的类。您可以覆盖默认处理器以使其成为任何您想要的,但您不必这样做。

有关更多信息,请参阅创建请求处理器的部分。

<?php

use Bitty\Middleware\MiddlewareChain;
use Psr\Http\Server\RequestHandlerInterface;

/** @var RequestHandlerInterface */
$defaultHandler = ...;

$middleware = new MiddlewareChain($defaultHandler);

您也可以在构建中间件链之后设置默认处理器。

<?php

use Bitty\Middleware\MiddlewareChain;
use Psr\Http\Server\RequestHandlerInterface;

/** @var RequestHandlerInterface */
$defaultHandler = ...;

$middleware = new MiddlewareChain();
$middleware->setDefaultHandler($defaultHandler);

添加中间件

添加的所有中间件都必须实现 Psr\Http\Server\MiddlewareInterface。中间件链使用先入先出的方式构建。这意味着您添加的第一个中间件将是第一个被调用的中间件。您可以使用此方法按您希望的顺序组织您的中间件。

有关更多信息,请参阅创建中间件的部分。

<?php

use Bitty\Middleware\MiddlewareChain;
use Psr\Http\Server\MiddlewareInterface;

$middleware = new MiddlewareChain();

/** @var MiddlewareInterface */
$someMiddleware = ...;

$middleware->add($someMiddleware);

处理请求

最后一步是处理请求。中间件链将处理任何实现 Psr\Http\Message\ServerRequestInterface 的请求。这将产生一个 Psr\Http\Message\ResponseInterface,然后您可以将其发送给用户。

<?php

use Bitty\Middleware\MiddlewareChain;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

$middleware = new MiddlewareChain();

/** @var ServerRequestInterface */
$request = ...;

/** @var ResponseInterface */
$response = $middleware->handle($request);

创建请求处理器

如果您希望在没有任何中间件处理请求的情况下返回简单的 404 未找到响应,您必须构建自定义请求处理器。您可以使用此功能返回错误页面、将用户重定向到搜索页面或显示帮助页面。请求处理器可以是任何实现 Psr\Http\Server\RequestHandlerInterface 的类。

<?php

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

class SomeHandler implements RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        /** @var ResponseInterface */
        $response = ...;

        return $response;
    }
}

然后您只需将处理器设置为中间件链的默认处理器。

<?php

$defaultHandler = new SomeHandler();
$middleware = new MiddlewareChain($defaultHandler);

创建中间件

创建中间件组件有两种基本方法

  1. 预处理中间件
  2. 后处理中间件

预处理中间件

这种中间件风格拦截所有请求,并且有阻止其他中间件被调用的能力。它还可以在将请求传递给下一个处理器之前修改请求。安全层可能会使用这种风格的中间件,因为它可以确定用户是否有权执行某个操作,并在必要时停止请求继续。

<?php

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

class SomeMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        if (/* able to process request */) {
            /** @var ResponseInterface */
            $response = ...;

            return $response;
        }

        // You can modify the request before passing it along
        $newRequest = $request->withHeader('X-Validated', 'true');

        // if unable to handle request, call the next middleware handler
        return $handler->handle($newRequest);
    }
}

后处理中间件

或者,您可以使用后处理中间件,允许调用所有其他中间件,然后它可以在将响应返回给用户之前拦截响应。这种类型的中间件可能用于API,以确保在请求API资源时始终添加JSON内容类型。

<?php

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

class SomeMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        /** @var ResponseInterface */
        $response = $handler->handle($request);

        if (/* request meets criteria */) {
            return $response->withHeader('Content-type', 'application/json');
        }

        return $response;
    }
}