2015-03-07 5 views
4

PSR-7 скоро будет стандартизован (я считаю). Это заставило меня задуматься о посредниках, таких как Phly, StackPHP и ConnectJS.Где разместить новые объекты, созданные промежуточным программным обеспечением?

Способ ConnectJS заключается в том, что он изменяет объект запроса, когда промежуточное программное обеспечение должно что-то добавить. Например, cookie-session создает 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, оба нашего запрос и ответ объекты (предполагается) неизменно, так как мы должны пройти вдоль дополнительных данных, таких как это? то есть где лучше всего будет хранить объект «сеанс» или «пользовательский» объект, созданный промежуточным программным обеспечением аутентификации?

+0

Я не очень хорошо знаю middlewares и ConnectJs, но я думаю, что вы можете решить свою проблему непреложности, создав новый экземпляр запроса или ответа, вместо того, чтобы мутировать его и возвратить новый экземпляр. Возможно, это могло бы помочь: https://github.com/phly/conduit#next – marcosh

+0

@marcosh. Правильно, но под каким свойством, определенным интерфейсом, вы сохранили бы такие данные? – mpen

+0

Пока свойство, которое нужно добавить, не имеет аналога в HTTP-сообщении, я бы не использовал свойство, определенное интерфейсом, но я бы использовал новое заданное свойство, например $ request-> session – marcosh

ответ

3

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

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

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

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

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

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

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

-1

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

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

Будьте в явном виде.

+0

Это не работает. Метод «действия», о котором вы говорите, и промежуточное ПО, о котором я говорю, могут быть разделены 20 другими средними. Его нужно пропустить. – mpen

Смежные вопросы

 Смежные вопросы