rapp-lib/middleman

PSR-7 中间件分发器。让我们停止尝试让它变得复杂。| mindplay/middleman PHP5.3 兼容分支

2.0.1.1 2017-06-22 16:37 UTC

This package is not auto-updated.

Last update: 2024-09-15 21:06:20 UTC


README

简单的 PSR-15 / PSR-7 中间件 分发器。

提供(可选)与符合 container-interop 的依赖注入容器的集成。

要从 1.x 升级到 2.x,请参阅 UPGRADING.md

PHP Version Build Status Code Coverage Scrutinizer Code Quality

让我们停止尝试让它变得复杂

use Psr\Http\Message\RequestInterface as Request;
use Zend\Diactoros\Response;

$dispatcher = new Dispatcher([
    function (Request $request, callable $next) {
        return $next($request); // delegate control to next middleware
    },
    function (Request $request) {
        return (new Response())->withBody(...); // abort middleware stack and return the response
    },
    // ...
]);

$response = $dispatcher->dispatch($request);

为了简单起见,中间件堆栈本身是不可变的 - 如果你需要一个可操作的堆栈,arrayArrayObjectSplStack 等都是不错的选择。

如果你更喜欢将中间件实现为可重用类,只需实现带有正确回调签名的 __invoke() - 或者,可选地,实现 MiddlewareInterface,如下所示

use Psr\Http\Message\RequestInterface as Request;

class MyMiddleware implements MiddlewareInteface
{
    public function __invoke(Request $request, callable $next) {
        // ...
    }
}

请注意,这可以在不实现 implements MiddlewareInterface 的情况下工作,只要您正确地得到回调签名。

如果您想将其连接到 DI 容器,您可以添加一个 "resolver",它将应用于您的中间件堆栈中的每个元素 - 例如

$dispatcher = new Dispatcher(
    [
        RouterMiddleware::class,
        ErrorMiddleware::class,
    ],
    new ContainerResolver($container)
);

请注意,“resolver” 是任何具有类似 function (string $name) : MiddlewareInterface 签名的可调用函数 - 如果您想让 Dispatcher 深度集成到您选择的框架中,您可以使用自定义 resolver 闭包。

如果您想了解这个组件是如何工作的,整个组件 只是一个类,只有几行代码 - 如果您打算基于中间件构建您的下一个项目,您可以(并且应该)了解整个机制。

中间件?

中间件是一种强大而简单的控制设施。

如果您对中间件的概念不太熟悉,以下部分将提供一个基本概述。

简而言之,中间件组件是一个函数(或 MiddlewareInterface 实例),它接受一个传入的(PSR-7)RequestInterface 对象,并返回一个 ResponseInterface 对象。

它以三种方式之一完成此操作:通过 假设委托共享 责任来创建响应对象。

1. 假设责任

一个中间件组件通过创建并返回一个响应对象来 假设 责任,而不是将责任委托给堆栈中的下一个中间件

use Zend\Diactoros\Response;

function ($request, $next) {
    return (new Response())->withBody(...); // next middleware won't be run
}

堆栈顶部的中间件具有完全绕过堆栈中更下面中间件的能力。

2. 委托责任

通过调用 $next,堆栈顶部的中间件可以选择将创建响应的责任完全委托给堆栈中更下面的其他中间件组件

function ($request, $next) {
    if ($request->getMethod() !== 'POST') {
        return $next($request); // run the next middleware
    } else {
        // ...
    }
}

请注意,耗尽中间件堆栈将导致异常 - 假设堆栈中最底部的中间件组件始终会产生某种类型的响应,通常是“404未找到”错误页面。

3. 分担责任

堆栈顶部的中间件可以选择将创建响应的责任委托给堆栈更低的中间件,然后在对返回的响应进行额外的修改后再将其返回

function ($request, $next) {
    $result = $next($request); // run the next middleware

    return $result->withHeader(...); // then modify it's response
}

堆栈顶部的中间件组件最终拥有最多的控制权,因为它可以在返回之前覆盖响应对象中的任何属性。