4

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

ConnectJS 的工作方式是在中间件需要添加某些内容时修改请求对象。例如,cookie-session在对象上创建一个session属性req

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 对象(应该是)不可变的,那么我们应该如何传递这样的额外数据呢?即,存储由身份验证中间件创建的“会话”对象或“用户”对象的最佳位置在哪里?

4

2 回答 2

3

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

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

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

并从那时起使用新实例。

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

如果您需要在请求对象中存储从当前请求计算的附加数据,则在ServerRequestInterface其中定义了允许您执行此操作withAttribute的方法。withAttributes

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

于 2015-03-10T18:10:50.973 回答
-1

根本不存储。将其作为参数注入消费者函数。例如:

function doSomething(reqest, response, session, user, foo, bar, ...)

明确。

于 2015-05-30T13:04:52.317 回答