thecodingmachine / drupal-stratigility-bridge
此Drupal 8模块通过Stratigility提供了包含PSR-15中间件的功能。
Requires
- php: >=7.0
- psr/http-server-middleware: ^1.0
- thecodingmachine/symfony-psr15-bridge: ^1.0
- zendframework/zend-stratigility: ^3.0
README
通过使用Zend Framework的Stratigility,在Drupal 8和PSR-15中间件模块之间建立桥梁。
版本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响应以修改它也是不可能的。