php - 中间件生成的新对象放在哪里?

标签 php design-patterns psr-7

PSR-7很快就会标准化(我相信)。这让我想到了中间件,例如 Phly 使用的, StackPHP , 和 ConnectJS .

ConnectJS 的工作方式是当中间件需要添加一些东西时,它会修改请求对象。例如,cookie-sessionreq 对象上创建一个 session 属性:

app.use(session({
  keys: ['key1', 'key2']
}))

app.use(function (req, res, next) {
  var n = req.session.views || 0 // <-- req.session is managed by the session middleware
  req.session.views = ++n 
  res.end(n + ' views')
})

使用 PSR-7,我们的 Request 和 Response 对象(应该)都是不可变的,那么我们应该如何像这样传递额外的数据呢?即,哪里是存储“ session ”对象或由身份验证中间件创建的“用户”对象的最佳位置?

最佳答案

PSR-7 中的请求和响应对象被实现为值对象,因此它们是不可变的。

每次你需要一个不同的对象时,你从前一个对象创建一个新的实例,比如

$newRequest = $oldRequest->withMethod('GET');

从那时起使用新实例。

在中间件中,您必须将新实例传递给调用下一个中间件的 next() 函数(例如,参见 here)。

如果您需要在请求对象中存储根据当前请求计算的附加数据,在 ServerRequestInterface 中定义了 withAttributewithAttributes 方法,让您可以做到这一点。

一个常见的用例是存储路由结果,但您当然可以使用它们来存储请求的其他附加数据,如 session 或用户数据

关于php - 中间件生成的新对象放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909976/

相关文章:

php - 在 Laravel 中对 div 和数据值使用循环

php - 即使引用正确,$_POST 也是空的

java - 设计模式,无需重新编译/重新链接即可覆盖方法

java - 在 Java 中实例化 MVC 对象时处理依赖关系

php - 使用 Div 和 PHP 的棋盘?

javascript - 认为我的 ajax 有问题吗?

php - PSR-7:getParsedBody() 与 getBody()

java - Facade 模式 - 返回原始对象或修改后的原始对象

php - 我可以将 PSR-7 StreamInterfaces 与 PHP 的 native 流函数一起使用吗?