PSR-7很快就会标准化(我相信)。这让我想到了中间件,比如Phly、StackPHP和ConnectJS使用的中间件。
ConnectJS的工作方式是,当中间件需要添加一些东西时,它会修改请求对象。例如,cookie会话在req
对象上创建一个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,我们的请求和响应对象都是(应该)不可变的,那么我们应该如何传递这样的额外数据呢?即,存储由身份验证中间件创建的"会话"对象或"用户"对象的最佳位置在哪里?
每次你需要一个不同的对象时,你都会从上一个创建一个新的实例,比如
$newRequest = $oldRequest->withMethod('GET');
并从那时起使用新实例。
在中间件中,您必须将新实例传递给调用下一个中间件的next()
函数(例如,请参阅此处)。
如果您需要在请求对象中存储根据当前请求计算出的其他数据,则在ServerRequestInterface
中定义了withAttribute
和withAttributes
方法,使您能够做到这一点。
这方面的一个常见用例是存储路由的结果,但您肯定可以使用它们来存储请求的其他附加数据,如会话或用户数据
根本不存储。将其作为参数注入消费者函数。例如:
function doSomething(reqest, response, session, user, foo, bar, ...)
要明确。