danielspk/tornadohttp

中间件容器 PSR-15

4.0.1 2021-11-17 17:15 UTC

README

Build Status Coverage Status Latest Stable Version Total Downloads License SensioLabsInsight

ScreenShot

TORNADO HTTP 是一个 PSR-15 中间件处理程序 PSR-15

文档

以下文档将向您展示如何使用 Tornado Http。

安装

建议通过以下方式使用 Composer 安装此库:

    php composer.phar require danielspk/tornadohttp:~4.0

这将安装 Tornado HTTP 并更新 composer.json 文件,添加以下依赖项:

{
    "require": {
        "danielspk/tornadohttp": "~4.0"
    }
}

创建应用程序容器

Tornado Http 可以以多种方式构建:

无参数

    $app = new \DMS\TornadoHttp\TornadoHttp();

带有中间件队列

    $app = new \DMS\TornadoHttp\TornadoHttp(
        [
            ['middleware' => (new MiddlewareClass)],
            ['middleware' => $middlewareOne],
            ['middleware' => 'ServiceMiddlewareTwo'],
            ['middleware' => 'App\MiddlewareThree', 'path' => '/admin'],
            ['middleware' => ['App\MiddlewareFour', [$paramOne, $paramTwo]]],
        ]
    );

注意:您可以看到有四种注册中间件的方式:a) MiddlewareInterface 实例,b) 包含在容器中的服务的字符串引用,c) 命名空间字符串引用类,d) 类字符串引用和构造函数参数数组。稍后将详细介绍每种方式。

带有默认响应

    $app = new DMS\TornadoHttp\TornadoHttp(
        [],
        new DefaultResponse()
    );

带有服务容器

    $app = new DMS\TornadoHttp\TornadoHttp(
        [],
        new DefaultResponse(),
        new Container()
    );

注意:要使用的服务容器必须遵循 PSR-11 标准。

带有自定义中间件解析器

    $resolver = class () implements ResolverInterface {
        public function solve($middleware) : MiddlewareInterface {
            // ...
        };
    };

    $app = new DMS\TornadoHttp\TornadoHttp(
        [],
        new DefaultResponse(),
        new Container(),
        new $resolver()
    );

带有执行环境

    $app = new DMS\TornadoHttp\TornadoHttp(
        [],
        new DefaultResponse(),
        new Container(),
        null,
        'development'
    );

中间件队列

Tornado Http 支持三种不同的方式来注册中间件:

  • 通过其 constructor
  • 通过 add() 方法
  • 通过 addList() 方法

示例

    // mediante el constructor
    $app = new DMS\TornadoHttp\TornadoHttp(
        [
            ['middleware' => (new MiddlewareClass)],
        ]
    );
    // mediante el método add()
    $app->add('ServiceMiddleware', '/', ['GET', 'POST'], ['dev', 'prod'], 0);
    // mediante el método addList()
    $app->addList([
        ['middleware' => (new MiddlewareClass)],
        ['middleware' => 'ServiceMiddleware'],
    ]);

Tornado Http 提供了一个可以自动解析注册中间件执行的类。

使用其解析器,Tornado Http 默认有四种注册中间件的方式:

  • 通过 类实例
  • 通过 字符串 引用容器中的服务
  • 通过 字符串 引用类的命名空间
  • 通过 数组

所有中间件都必须实现 \Psr\Http\Server\MiddlewareInterface

示例

    // mediante una instancia de clase
    $app->add(new MiddlewareClass);

    // mediante un string de referencia a un servicio del contenedor
    $app->add('ServiceMiddleware');

    // mediante un string de referencia a un namespace de clase
    $app->add(App\MiddlewareClass::class);

    // mediante un string de referencia a un namespace de clase y parámetros de constructor
    $app->add([App\MiddlewareClass::class, [$param1, $param2]]);

每个中间件都可以使用以下可选执行过滤器进行注册

  • 允许的 HTTP 方法
  • URL 路径
  • 允许的执行环境

示例

    // mediante el constructor
    $app = new DMS\TornadoHttp\TornadoHttp(
        [
            [
                'middleware' => (new MiddlewareTimeExecutionClass),
                'path'       => '/admin',
                'env'        => ['develop'],
            ],
            [
                'middleware' => (new MiddlewareLogClass),
                'methods'    => ['POST', 'PUT'],
                'env'        => ['production', 'develop'],
            ],
        ]
    );

容器特性

Tornado Http 提供了一个可以在中间件中使用的 trait。

当 Tornado Http 检测到中间件使用 Container\ContainerTrait 时,会自动注入在 Tornado Http 中注册的服务容器。

您可以在中间件中以下方式访问服务容器:

    class ExampleMiddleware implements \Psr\Http\Server\MiddlewareInterface
    {
        use \DMS\TornadoHttp\Container\ContainerTrait;

        public function getViewEngine()
        {
            return $this->getContainer()->get('view_engine');
        }

        // ...
    }

自定义解析器

Tornado Http 允许注册自定义中间件解析器。这样,您可以替换或扩展前面提到的四种注册中间件的方式。

示例

    class CustomResolver implements ResolverInterface {
        public function solve(string $middlewareClass) : MiddlewareInterface {
            return new $middlewareClass();
        }
    }

    $app = new DMS\TornadoHttp\TornadoHttp();
    $app->setResolver(new CustomResolver());

接口/特质/类和方法摘要

DMS\TornadoHttp\TornadoHttp

DMS\TornadoHttp\Container\ContainerTrait

DMS\TornadoHttp\Container\InjectContainerInterface

DMS\TornadoHttp\Middleware\Middleware

DMS\TornadoHttp\Resolver\Resolver

DMS\TornadoHttp\Resolver\ResolverInterface

灵感来源

许可证

本项目基于 MIT 许可证分发。

建议和合作

Daniel Spiridione - http://daniel-spiridione.com.ar