Цитата (Arh @ 19.12.2017 - 22:30) |
ведь мы можем вернуть только response, как следующему обработчику передать свой request? |
Обычно, если возвращается объект Response то это сигнал ядру системы - прекратить выполнение последующих смстем/компонентов/цепочек (чего угодно) и перейти непосредственно к процессу передачи ответа клиенту. То есть к завершающей фазе, нечто вроде GoTo.
Для передачи информации между RR обработчиками, например в HTTP Foundation используется специальное свойство объекта Request. Вот так просто, да. =)
Зачем "подменять" Request, создай новый и запусти с ним $kernel->handle() с доп. параметром (или что там у тебя), subrequest называется. Это в случае когда речь идет о необходимости замены свойств, что должны оставаться иммутабельными.
Цитата (Arh @ 19.12.2017 - 18:30) |
но потом начал натыкаться на psr-7, думал они что то решили как то, а в итоге ничего нового, всё та же древняя идея, всё те же древние проблемы в новой обёртке. Всё новое это хорошо забытое старое) |
PSR-7, это абстракция над HTTP, и к мидлварам имеет весьма опосредствованное отношение. Другими словами, этот "стандарт" регламентирует объекты Request и Response, а мидлвары ты можешь писать как угодно. Можешь вообще не писать. Допустим в Slim используют три аргумента, передавая третьим следующий мидлвар. Если тебе хочется передать их массивом - ни кто возражать не станет. Важно не как ты их передаешь, а как они устроены, объекы Request и Response.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
twin
А, ок. Значит меня ввели в заблуждение какие то статьи про psr 7.
Ron
Цитата |
Обычно, если возвращается объект Response то это сигнал ядру системы - прекратить выполнение последующих смстем/компонентов/цепочек |
Подождите, подождите.
Если будем останавливать цепочку после первого мидлвара, тогда какие это мидлвары, если в итоге срабатывает только первый.
Замыкать цепь должен либо последний, либо замыкающий. Замыкающий можно например как то настройками указать, что его ответ в любом случае последний, обрывающий (если он что то ответил).
Тогда можно например последним поставить мидлвар, который берёт ответ предыдущих и кеширует, а первым поставить который смотрит есть ли кеш по такому запросу и если есть, то возвращает ответ и обрывает цепь.
Цитата |
Для передачи информации между RR обработчиками, например в HTTP Foundation используется специальное свойство объекта Request. Вот так просто, да. =) |
Эту строчку не понял. HTTP Foundation это что то из симфони?
То есть там есть глобальное свойство Request, и если в мидлваре нужно получить ответ от другой цепочки, тогда нужно на глобальном уровне подменять Request? В общем непонятно что ты имеешь ввиду.
То что я написал "По началу между ними ничего не передавал, тогда всё на статике писал и обмен данными был через статические свойства.". Это ты своими словами написал?
Цитата |
Зачем "подменять" Request |
Да мало ли. От клиента пришли какие то данные, с которыми работают милдвары. Например когда к тебе заходят боты, допустим они приходят с заголовком isBot: true, и все приложения как то на него реагируют, а бот какого нить спутынка приходит с заголовком yaBot: da.
В током случае можно в начало поставить мидлвар, который при наличии yaBot: da; добавляет isBot: true, и не надо это условие копипастить по всей системе.
Цитата |
Зачем "подменять" Request, создай новый и запусти с ним $kernel->handle() |
А как я создам новый, если я не знаю всего что там пришло, мне нужно только одно свойство подменить.
Цитата |
что должны оставаться иммутабельными |
Зачем? Это же всё перечёркивает. Зачем тогда вся эта абстракция. Мы по сути имеем тот же глобальный $_POST, только теперь он ещё и в константе. Так что ли?
_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh, слушай, да я не знаю, у меня таких проблем не бывает, никогда причем. Поэтому не понимаю чего хочешь, попытался, но, очевидно, не угадал.
HTTP Foundation, да, это Symfony и там в качесвте DTO (или вроде того) между различными обработчиками, используется свойство объекта Request, в котором хранится ParameterBag.
С моей точки зрения, "подменять" Request вообще нелья в рамках выполняемого запроса (метода handle(), если хочешь). Однако, не вижу ничего зазорного в том, чтобы упомянутый объект дополнить своими данными. Их можно в конце концов вычистить, в случае экспорта другой, независимой подсистеме, где про наши "заметки" знать не обязательо.
Вот твина я на сей раз очень хорошо понял, и готов присоединиться к непрозвучавшему напрямую вопросу: "причем тут вообще PSR-7?".
Цитата (Arh @ 20.12.2017 - 11:54) |
Зачем? Это же всё перечёркивает. Зачем тогда вся эта абстракция. |
Главным образом для совместимости. Но и для более удобной работы в парадигме ООП тоже!
Цитата (Arh @ 20.12.2017 - 11:54) |
Мы по сути имеем тот же глобальный $_POST, только теперь он ещё и в константе. Так что ли? |
Да, всё что идет в запросе должно оставаться либо в неизменном, либо в легко обратимом к первоначальному состоянию, виде. Не знаю уж насколько Request должен быть (супер)глобальным, с моей точки зрения чем больше глобального в твоей системе, тем меньше она соответствует ООП.
Ron
Понятно.
_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
В PSR-7 кстати есть такая фишка, как объект-значение. Если что то в объекте изменяется, то метод
всегда возвращает
новый объект. Это как раз и дает возможность гибкого изменения состояния текущего объекта, не затрагивая состояние системы. Так что если хочешь, всегда можно построить её так, что можно вернуться в любую точку, а можно просто выполнять цепочку(и). Тут тебе и глобальные и текущие значения, выбирай на вкус.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Пацаны то и не знают
https://github.com/php-fig/fig-standards/bl...est-handlers.md
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Цитата (chee @ 20.12.2017 - 17:59) |
Пацаны то и не знают |
Ну он как бы не принят еще, 15-й PSR. Рановато на него ссылаться.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Кто то уже пользовался psr-7?
_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh, эм, я. В своих цмсках и на одном реальном проекте.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
chee
А ты свою реализацию делал, или что стороннее?
_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Цитата (Arh @ 21.12.2017 - 17:33) |
А ты свою реализацию делал, или что стороннее? |
Я писал свою. Есть вопросы? Задавай, я про него очень много знаю теперь.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
twin
Есть 100500 вопросов, надо все вспомнить и как то сформулировать)
Перечитал тему.
Про потоки.
Ron писал
Цитата |
twin, можно немного поконкретнее, какие там потоки? Про ReactPHP что ли? |
Ты ответил
Цитата |
Сейчас я пишу статью про всё это. smile.gif |
Но в статье про потоки только один абзац, просто упоминание что они есть, всё. Как говорится -
тема сисек не раскрыта.
Я бы хотел вкурить это всё. Возможно статью почитать.
В теле Response всегда поток? По умолчанию?
Что если между тем как мы напишем в каком то из мидлваров
return new Request($stream);
И тем как мы отправим это в браузер
$request->send();
Что если между тем и этим мы напишем ob_start(); ob_clean(); это же тоже поток, они как то связаны? одно не поломает другое?
КроссплатформенностьВ статье
Цитата |
Это довольно интересно и выгодно производителям различных плагинов и компонентов. Сейчас они пишутся под конкретную среду. Под Symfony, WordPress, Джумлу наконец. А если все будут юзать один стандарт, то плагины станут универсальными. А значит расширится рынок сбыта. |
Но когда я спрашивал про $http = (object)[request, response];, ты сказал что можно и так, что суть не в этом.
Да и в теме такое звучало:
twin
Цитата |
Но окрываю доку Slim, и что вижу... $email = $app->request()->post('email'); Простите, но метод post() не сертифицирован в PSR-7. Хотя Slim громко заявляет о своей бесконечной ему преданности. |
Так вот плагин из одной cms использует дополнительные обвесы на psr-7 (slim), а плагин из другой cms в метод получает не $request && $response и возвращает $response, а получает vasya\http, которое содержит psr-7 request/response со своими обвесами
вот.
Они всё равно "станут универсальными"?
Ещё про потокиtwinЦитата |
PSR-7 призывает парсить сырой поток, и получать запчасти из него. |
Как наполняется Request? Тоже из потока? Или туда по старинке передаются $_GET, $_POST итд, видел где то, вроде в aura про psr-7, неуверен, краем глаза что то попадалось.
Вот напримерТретий параметр заголовки. Нужно туда getallheaders() передать? Почему это не обязательный параметр? Как мы без заголовков?
У меня сейчас мало времени что бы вкуривать исходники например того же
guzzle/psr7, где "get started" для чайников? ява за 7 дней?
Пока всё) пора спать
_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.