首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应对象上的PSR-7“属性”

响应对象上的PSR-7“属性”
EN

Stack Overflow用户
提问于 2016-07-09 03:31:29
回答 3查看 1.7K关注 0票数 2

我正在使用PSR-7 (使用Zend Expressive)进行开发。我想出了方法

代码语言:javascript
复制
ServerRequestInterface::withAttribute()

我想知道为什么对象响应没有一个。我想在处理后通过中间件传递元数据,在“响应端”。是否以某种方式将“属性”传递给响应以进行后处理?遵循架构指导原则,实现这一目标的最佳方式是什么?

EN

回答 3

Stack Overflow用户

发布于 2016-07-17 15:20:16

最佳实践是使用request对象在中间件之间传递数据。响应是要发送给客户端的内容,您希望保持这一点的整洁。请求只存在于服务器上,您可以添加要传递的(敏感数据)属性。如果出现错误或者在删除自定义数据之前提前返回响应,那么这并不重要,因为您的响应是“干净的”。

此外,如果您需要传递数据:中间件始终按照从配置中获取的顺序执行。这样,您就可以确保MiddlewareX中的请求对象包含MiddlewareY设置的数据。

更新:一个关于如何通过a请求传递数据的示例。

中间件2设置信使对象,中间件4可以使用该信使对象来设置再次退出时所需的数据。

代码语言:javascript
复制
<?php

namespace Middleware;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

class Middleware2
{
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
    {
        $messenger = new Messenger();

        // Do something else before next middleware

        if ($next) {
            $response = $next($request->withAttribute(Messenger::class, $messenger), $response);
        }  

        // Do something with the Response after it got back
        // At this point the $messenger object contains the updated data from Middleware4

        return $response->withHeader('Content-Language', $locale);
    }
}

中间件4抓取信使对象并更新其值。

代码语言:javascript
复制
<?php

namespace Middleware;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

class Middleware4
{
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
    {
        $messenger = $request->getAttribute(Messenger::class);
        $messenger->info('going in');
        // Do something else before next middleware

        if ($next) {
            $response = $next($request->withAttribute(FlashMessenger::class, $messenger), $response);
        }  

        // Do something with the Response after it got back
        $messenger->info('going out');

        return $response->withHeader('Content-Language', $locale);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2016-07-09 21:26:01

PSR-7规范仅为服务器请求定义属性。它们主要用于存储从传入请求推导出的元数据,以便稍后到达域层时使用它们。

另一方面,响应通常在域层创建,并在实际发送到客户端之前遍历所有中间件堆栈。因此,添加到响应中的元数据将没有实际可以使用的地方。

我猜如果你想把数据从内部中间件传递到外部中间件,最好的方法是使用响应头。

票数 2
EN

Stack Overflow用户

发布于 2017-12-22 22:03:18

我不确定这是否是“最佳实践”,但另一种可能是简单地将数据对象注入中间件。

中间件2注入了一个信使对象,并在上面设置了一些数据:

代码语言:javascript
复制
<?php

namespace Middleware;

use Interop\Http\Server\MiddlewareInterface;
use Interop\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

class Middleware2
{

    private $messenger;

    public function __construct(Messenger $messenger)
    {
        $this->messenger = $messenger;
    }

    public function process(
        ServerRequestInterface $request,
        RequestHandlerInterface $handler
        ): ResponseInterface {
            $this->messenger->foo = 'bar';
            $response = $handler->handle($request);
            if ($this->messenger->foo = 'baz') {
                return $response->withHeader('Really-Important-Header', 'Baz');
            }
            return $response;
        }
}

中间件4更改数据:

代码语言:javascript
复制
<?php

namespace Middleware;

use Interop\Http\Server\MiddlewareInterface;
use Interop\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

class Middleware4
{

    private $messenger;

    public function __construct(Messenger $messenger)
    {
        $this->messenger = $messenger;
    }

    public function process(
        ServerRequestInterface $request,
        RequestHandlerInterface $handler
        ): ResponseInterface {
            $this->messenger->foo = 'baz';
            return $handler->handle($request);
        }
}

您甚至可以使用其中一个中间件作为信使。

注意:您必须确保这两个类都是用相同的信使对象构造的。但这似乎是大多数依赖注入容器的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38274111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档