phapi/pipeline

该软件包已被废弃,不再维护。没有推荐替代软件包。

Phapi Pipeline 是一个处理中间件队列的中间件管道。Phapi Pipeline 依赖于 PSR-7

1.0.0 2015-07-02 08:26 UTC

This package is not auto-updated.

Last update: 2021-02-05 22:11:27 UTC


README

Build status Code Climate Test Coverage

Phapi 严重依赖中间件。几乎所有的功能都是中间件:路由、内容协商等。

为什么使用中间件?

好处很多。中间件易于替换,从性能角度来看,如果实现得当,可以绕过许多在特定情况下不需要运行的代码,例如,如果客户端达到速率限制,则无需执行路由、分配等操作。

安装

该软件包默认由 Phapi 框架安装。可以通过使用 composer 独立安装软件包以供使用。

$ composer require phapi/pipeline:1.*

用法

通过使用 pipe() 方法将新的中间件附加到管道。

<?php
$pipeline = new Phapi\Middleware\Pipeline();
$pipeline->pipe(new Middleware\Cors());

请注意,中间件将按照它们附加的顺序被调用。

中间件可以实现 Middleware 接口,但必须是可调用的。所有中间件都将使用三个参数:请求、响应和下一个。中间件应该调用 $next 变量,并传递 $request$response$next 参数。中间件还必须返回一个响应。

一旦队列变空,将返回结果响应实例。

错误处理

实现 ErrorMiddleware 接口使管道能够处理错误。中间件必须负责错误处理并调用 prepareErrorQueue() 方法。这将触发管道的重置,并且只有添加在错误中间件之前的中间件(通常为序列化中间件和将响应发送给客户端的中间件)将被调用。

创建自己的中间件类

中间件需要一个请求、一个响应和一个回调($next),如果中间件允许进一步处理请求,则会调用该回调。如果中间件不需要或不想允许进一步处理,则不应调用回调($next),而应返回一个响应。注意,$next 可以是 null

中间件的主要任务是处理传入的请求和/或响应。中间件必须接受一个请求和一个响应(PSR-7 兼容)实例,并对其进行操作。

中间件必须将请求和响应传递给 ($next) 回调,最后要么返回 ($next) 回调的响应,要么在返回之前修改响应。

示例

<?php
  public function __invoke(
    Request $request,
    Response $response,
    callable $next)
  {
      // Do something ...

      return $next($request, $response, $next);
  }

或者

<?php
  public function __invoke(
    Request $request,
    Response $response,
    callable $next)
  {
      // Do something ...

      $response = $next($request, $response, $next);

      // Modify response ...

      return $response;
  }

如果中间件应该断开管道,例如客户端达到速率限制,它应返回一个响应而不是调用 $next

示例

<?php
  public function __invoke(
    Request $request,
    Response $response,
    callable $next)
  {
      if ($this->tooManyRequests()) {
        // Set appropriate headers and body

        // Return response
        return $response;
      }

      return $next($request, $response, $next);
  }

依赖注入容器

如果您实现了名为 setContainer() 的方法,管道将调用该方法并提供可用于 __invoke() 方法的依赖注入容器。

示例

<?php
  public function setContainer($container)
  {
    $this->container = $container;
  }

完整示例

以下是一个中间件应如何呈现的完整示例。当您想编写自己的中间件时,请以此示例作为起点。

<?php

namespace Phapi\Middleware\Example;

use Phapi\Contract\Di\Container;
use Phapi\Contract\Middleware\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

/**
 * Eample middleware
 *
 * @category Phapi
 * @package  Phapi\Middleware\Example
 * @author   Peter Ahinko <peter@ahinko.se>
 * @license  MIT (https://open-source.org.cn/licenses/MIT)
 * @link     https://github.com/phapi/middleware-example
 */
class Example implements Middleware
{

    /**
     * Dependency injection container
     *
     * @var Container
     */
    private $container;

    /**
     * Set dependency injection container
     *
     * @param Container $container
     */
    public function setContainer(Container $container)
    {
        $this->container = $container;
    }

    /**
     * Invoking the middleware
     *
     * @param ServerRequestInterface $request
     * @param ResponseInterface $response
     * @param callable $next
     * @return ResponseInterface $response
     */
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next = null)
    {
        // Do something ...

        // Call next middleware
        $response = $next($request, $response, $next);

        // Do something with the response ...

        // Return the response
        return $response;
    }
}

许可协议

Phapi Middleware Pipeline 在 MIT 许可协议下授权 - 有关详细信息,请参阅 license.md 文件。

贡献

贡献、错误修复等始终受到欢迎。