Где разместить новые объекты, созданные промежуточным программным обеспечением?

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 (должны быть) неизменяемы, так как же нам передавать такие дополнительные данные? то есть где было бы лучшее место для хранения объекта ‘сеанса’ или объекта ‘пользователя’, созданного промежуточным программным обеспечением аутентификации?

4

Решение

Объекты Request и Response в PSR-7 реализованы как объекты-значения, поэтому они неизменны.

Каждый раз, когда вам нужен другой объект, вы создаете новый экземпляр из предыдущего, как

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

и с этого момента использовать новый экземпляр.

В промежуточном программном обеспечении вам придется передать новый экземпляр next() функция, которая вызывает следующее промежуточное ПО (см. Вот например).

Если вам необходимо сохранить в объекте запроса дополнительные данные, вычисленные из вашего текущего запроса, в ServerRequestInterface там определены withAttribute и withAttributes методы, которые позволяют вам сделать именно это.

Обычный вариант использования для этого — для сохранения результатов маршрутизации, но вы, несомненно, можете использовать их для хранения других дополнительных данных запроса, таких как данные сеанса или пользователя

3

Другие решения

Не хранить вообще. Введите его как параметр в функцию потребителя. Например:

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

Будь явным

-1

По вопросам рекламы [email protected]