PSR-7很快就会标准化(我相信)。这让我想到了中间件,例如 Phly 使用的, StackPHP , 和 ConnectJS .
ConnectJS 的工作方式是当中间件需要添加一些东西时,它会修改请求对象。例如,cookie-session在 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,我们的 Request 和 Response 对象(应该)都是不可变的,那么我们应该如何像这样传递额外的数据呢?即,哪里是存储“ session ”对象或由身份验证中间件创建的“用户”对象的最佳位置?
最佳答案
PSR-7 中的请求和响应对象被实现为值对象,因此它们是不可变的。
每次你需要一个不同的对象时,你从前一个对象创建一个新的实例,比如
$newRequest = $oldRequest->withMethod('GET');
从那时起使用新实例。
在中间件中,您必须将新实例传递给调用下一个中间件的 next()
函数(例如,参见 here)。
如果您需要在请求对象中存储根据当前请求计算的附加数据,在 ServerRequestInterface
中定义了 withAttribute
和 withAttributes
方法,让您可以做到这一点。
一个常见的用例是存储路由结果,但您当然可以使用它们来存储请求的其他附加数据,如 session 或用户数据
关于php - 中间件生成的新对象放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909976/