PSR-15 HTTP 中间件分发器

1.1 2018-11-10 20:49 UTC

This package is auto-updated.

Last update: 2024-09-07 00:32:38 UTC


README

无假设的 PSR-15 处理器

许可证

Pipe 采用 MIT 许可证授权。

安装

$ composer require gamringer/pipe

测试

$ composer install
$ phpunit

文档

以下是 Pipe 可以使用的各种方式。这些示例可以在 examples 目录中找到。首先,以下代码在所有示例中假设是存在的:

<?php

declare(strict_types=1);

include __DIR__.'/../vendor/autoload.php';

use GuzzleHttp\Psr7\ServerRequest;
use GuzzleHttp\Psr7\Response;
use gamringer\Pipe\Pipe;
use gamringer\Pipe\Example\StaticMiddleware;

// Request to be handled later
$request = new ServerRequest('GET', '/');

// For use in this example, we build a few Middleware objects

// One that simply returns a predetermined response in all cases
$staticResponse = new Response();
$staticResponseMiddleware = new StaticMiddleware($staticResponse);

// One that echoes it's constructor argument before passing to the next one.
$fooMiddleware = new FooMiddleware('1');

从中间件数组创建 pipe

// Build Pipe from an array of Middlewares
$pipe = new Pipe([
    $staticResponseMiddleware,
]);

// Use Pipe via RequestHandlerInterface
$response = $pipe->handle($request);

创建一个空 pipe 并动态添加中间件

// Build empty Pipe
$pipe = new Pipe();

// Add Middlewares dynamically
$pipe->push($staticResponseMiddleware);

// Use Pipe via RequestHandlerInterface
$response = $pipe->handle($request);

动态堆叠多个中间件

// Build empty Pipe
$pipe = new Pipe();

// Add Middlewares dynamically
$pipe->push($fooMiddleware);
$pipe->push($staticResponseMiddleware);

// Use Pipe via RequestHandlerInterface
$response = $pipe->handle($request);

将 pipe 用作中间件

Pipe 还可以通过 MiddlewareInterface 通过将其推入另一个 pipe 来使用

// Build empty Pipe
$pipe = new Pipe();

// Add Middlewares dynamically
$pipe->push($fooMiddleware);
$pipe->push(new Pipe([
    new FooMiddleware('2') 
]));
$pipe->push($staticResponseMiddleware);

// Use Pipe via RequestHandlerInterface
$response = $pipe->handle($request);

中间件用尽

如果没有中间件可以调用,Pipe 将根据其被调用的方式以不同的方式响应。

作为 RequestHandler

大多数应用程序将使用 Pipe 作为 RequestHandler 来堆叠中间件并处理用户请求。如果请求通过 Pipe,并且最后一个中间件尝试委派给下一个中间件,将引发一个 TerminalException。相同的逻辑也适用于空 pipe 的情况

$pipe = new Pipe();
$pipe->handle($request); // Throws new \gamringer\Pipe\TerminalException()

作为中间件

如果作为中间件调用,当自身没有中间件时,它将简单地传递给其下一个兄弟

// Build empty Pipe
$pipe = new Pipe();

// Add Middlewares dynamically
$pipe->push($fooMiddleware);
$pipe->push(new Pipe([
    new FooMiddleware('2')
]));
$pipe->push(new Pipe());
$pipe->push($staticResponseMiddleware);

// Use Pipe via RequestHandlerInterface
$response = $pipe->handle($request);