在哪里放置由中间件生成的新对象?

时间:2015-03-07 00:33:12

标签: php design-patterns psr-7

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

ConnectJS的工作方式是在中间件需要添加内容时修改请求对象。例如,cookie-sessionsession对象上创建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对象都是(应该是)不可变的,那么我们如何传递这样的附加数据呢?即哪里是存储会议的最佳地点?对象或用户&#39;由身份验证中间件创建的对象?

2 个答案:

答案 0 :(得分:3)

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

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

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

从那时起使用新实例。

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

如果您需要在请求对象中存储根据当前请求计算的其他数据,请在ServerRequestInterface中定义允许您完全执行的withAttributewithAttributes方法这一点。

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

答案 1 :(得分:-1)

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

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

明确。