gpt4 book ai didi

php - 响应对象上的 PSR-7 "attributes"

转载 作者:行者123 更新时间:2023-12-02 21:01:00 28 4
gpt4 key购买 nike

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

ServerRequestInterface::withAttribute()

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

最佳答案

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

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

更新:有关如何通过请求传递数据的示例。

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

<?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 获取信使对象并更新其值。

<?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);
}
}

关于php - 响应对象上的 PSR-7 "attributes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38274111/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com