ellipse/middleware-container

Psr-15 中间件代理 Psr-11 容器条目

1.0.3 2018-03-19 16:08 UTC

This package is auto-updated.

Last update: 2024-08-26 00:37:20 UTC


README

此包提供了一个 Psr-15 中间件,用于代理一个 Psr-11 容器条目。

要求 php >= 7.0

安装 composer require ellipse/middleware-container

运行测试 ./vendor/bin/kahlan

使用容器条目作为中间件

Ellipse\Middleware\ContainerMiddleware 接受一个实现了 Psr\Container\ContainerInterface 的实现和一个容器 ID 作为参数。它的 ->process() 方法通过此 ID 从容器中检索中间件并代理其 ->process() 方法。

当容器条目需要在请求处理时解析时,这非常有用。

当从容器中检索的值不是一个实现了 Psr\Http\Server\MiddlewareInterface 的对象时,将抛出 Ellipse\Middleware\Exceptions\ContainedMiddlewareTypeException

<?php

namespace App;

use SomePsr11Container;

use Ellipse\Middleware\ContainerMiddleware;

// Get some Psr-11 container.
$container = new SomePsr11Container;

// Add a middleware in the container.
$container->set('some.middleware', function () {

    return new SomeMiddleware;

});

// Create a container middleware with the Psr-11 container and the entry id.
$middleware = new ContainerMiddleware($container, 'some.middleware');

// The middleware ->process() method retrieve the middleware from the container and proxy it.
$response = $middleware->process($request, new SomeRequestHandler);

使用自动装配的示例

在容器中注册每个中间件类可能很麻烦。以下是使用来自 ellipse/container-reflection 包的 Ellipse\Container\ReflectionContainer 类自动装配中间件实例的方法。

<?php

namespace App;

use Psr\Http\Server\MiddlewareInterface;

use SomePsr11Container;

use Ellipse\Container\ReflectionContainer;
use Ellipse\Middleware\ContainerMiddleware;

// Get some Psr-11 container.
$container = new SomePsr11Container;

// Decorate the container with a reflection container.
// Specify the middleware implementations can be auto wired.
$reflection = new ReflectionContainer($container, [
    MiddlewareInterface::class,
]);

// Create a container middleware with the reflection container and a middleware class name.
$middleware = new ContainerMiddleware($reflection, SomeMiddleware::class);

// An instance of SomeMiddleware is built and its ->process() method is proxied.
$response = $middleware->process($request, new SomeRequestHandler);