PSR-7 скоро будет стандартизирован (я верю). Это заставило меня задуматься о промежуточном программном обеспечении, таком как Phly, StackPHP, а также ConnectJS.
ConnectJS работает так, что он модифицирует объект запроса, когда промежуточному программному обеспечению нужно что-то добавить. Например, печенье-сессия создает 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 (должны быть) неизменяемы, так как же нам передавать такие дополнительные данные? то есть где было бы лучшее место для хранения объекта ‘сеанса’ или объекта ‘пользователя’, созданного промежуточным программным обеспечением аутентификации?
Объекты Request и Response в PSR-7 реализованы как объекты-значения, поэтому они неизменны.
Каждый раз, когда вам нужен другой объект, вы создаете новый экземпляр из предыдущего, как
$newRequest = $oldRequest->withMethod('GET');
и с этого момента использовать новый экземпляр.
В промежуточном программном обеспечении вам придется передать новый экземпляр next()
функция, которая вызывает следующее промежуточное ПО (см. Вот например).
Если вам необходимо сохранить в объекте запроса дополнительные данные, вычисленные из вашего текущего запроса, в ServerRequestInterface
там определены withAttribute
и withAttributes
методы, которые позволяют вам сделать именно это.
Обычный вариант использования для этого — для сохранения результатов маршрутизации, но вы, несомненно, можете использовать их для хранения других дополнительных данных запроса, таких как данные сеанса или пользователя
Не хранить вообще. Введите его как параметр в функцию потребителя. Например:
function doSomething(reqest, response, session, user, foo, bar, ...)
Будь явным