thecodingmachine/drupal-stratigility-bridge

此Drupal 8模块通过Stratigility提供了包含PSR-15中间件的功能。

1.0.x-dev 2018-05-29 14:55 UTC

This package is auto-updated.

Last update: 2024-09-06 23:36:27 UTC


README

通过使用Zend Framework的Stratigility,在Drupal 8和PSR-15中间件模块之间建立桥梁。

Latest Stable Version Total Downloads Latest Unstable Version License Scrutinizer Code Quality

版本1.0允许您在Drupal 8中使用PSR-15中间件。版本0.x是现在已弃用的http-interop中间件的桥梁。

安装

这是一个Drupal 8模块。

推荐通过Composer安装drupal-stratigility-bridge。

composer require thecodingmachine/drupal-stratigility-bridge

使用

此模块将在Drupal容器中填充一个新的stratigility_pipe条目(它是一个Zend\Stratigility\MiddlewarePipe)。

您可以在自己的模块中扩展此条目以注册新的中间件。

在Drupal服务中,您只需将psr15_middleware添加到您的中间件服务中。这将自动在Stratigility的管道中注册中间件。

因此,您的MYMODULE.services.yml将看起来像这样

services:
  my_middleware:
    class:      Acme\MyMiddleware
    tags:
      - { name: psr15_middleware }

在PSR-15中间件中使用Drupal渲染数组

此模块附带一个服务,允许您渲染Drupal "数组"

为此,只需在控制器中注入drupal_array_render_caller服务并调用getResponse方法。

以下是一个示例中间件,当访问"/foo"页面时,它返回一个"Hello world!"的Drupal页面

class HelloWorldMiddleware implements MiddlewareInterface
{
    /**
     * @var DrupalArrayRenderCaller
     */
    private $arrayRenderCaller;

    public function __construct(DrupalArrayRenderCaller $arrayRenderCaller)
    {
        $this->arrayRenderCaller = $arrayRenderCaller;
    }

    public function process(ServerRequestInterface $request, RequestHandlerInterface $delegate)
    {
        if (trim($request->getUri()->getPath(), '/') === 'foo') {
            // Let's render a drupal page
            return $this->arrayRenderCaller->getResponse(array(
                '#type' => 'markup',
                '#title' => "My title",
                '#markup' => t('Hello world')
            ));
        } else {
            return $delegate->process($request);
        }
    }
}

工作原理

此模块监听由Drupal内核在每次请求时触发的KernelEvents::REQUEST事件。

将Symfony请求转换为PSR-7请求,然后将其发送到Stratigility的中间件管道。

如果中间件返回PSR-7响应,则将此响应发送回用户。如果所有中间件都在调用“下一个”中间件,则最后一个中间件是一个返回“418 I'm a teapot”响应的虚拟中间件。此响应被模块解释为“我不关心”响应,并将渲染传递给Drupal以继续渲染。

限制

提供的Stratigility中间件并不是“真正”的中间件,因为它们不能修改来自Drupal的请求或响应。它们在Drupal之前运行,在单独的中间件堆栈中。如果您想在Drupal之前添加自己的路由器,这仍然非常有用!

目前,PSR-7请求永远不会转换回Symfony请求。这意味着中间件对PSR-7请求所做的任何修改都将被Drupal忽略。由于Drupal的构建方式,在PSR-15中间件中捕获Drupal响应以修改它也是不可能的。