Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのか
Search
Hisateru Tanaka
December 15, 2018
Technology
5.3k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのか
PHPカンファレンス2018 発表資料です
Hisateru Tanaka
December 15, 2018
More Decks by Hisateru Tanaka
See All by Hisateru Tanaka
どうなる Remix 3
tanakahisateru
2
530
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
2
280
哲学史とモデリング
tanakahisateru
4
980
オブジェクト指向宗教史
tanakahisateru
32
18k
ほげ言語にあってPHPにない機能
tanakahisateru
6
3.9k
君たちはどうプログラミングするか
tanakahisateru
16
3.1k
デバッグ用ロガーの注入どうする?
tanakahisateru
2
710
アンドキュメンテッド ちょうぜつソフトウェア 設計入門 「オブジェクト指向に定義はない」のか?
tanakahisateru
25
10k
ちょうぜつ改め21世紀ふつうのソフトウェア設計
tanakahisateru
14
8.7k
Other Decks in Technology
See All in Technology
protovalidate-es を導入してみた
bengo4com
0
170
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.9k
AWSシリコン最前線 〜AI時代のチップ選択を読み解く〜
htokoyo
2
400
失敗を資産に変えるClaude Code
shinyasaita
0
300
EventBridge Connection
_kensh
5
690
やさしいA2A入門
minorun365
PRO
11
1.7k
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
130
チームで進めるAI駆動アジャイル×ウォーターフォール
kumaiu
0
150
MCP Appsを作ってみよう
iwamot
PRO
4
490
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
4
1.3k
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
920
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.9k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Tell your own story through comics
letsgokoyo
1
950
Scaling GitHub
holman
464
140k
Bash Introduction
62gerente
615
220k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Designing Experiences People Love
moore
143
24k
We Are The Robots
honzajavorek
0
240
Building Adaptive Systems
keathley
44
3k
Code Review Best Practice
trishagee
74
20k
Mind Mapping
helmedeiros
PRO
1
240
The Cost Of JavaScript in 2023
addyosmani
55
10k
Transcript
1)1'*(ͷ)551 ॲཧඪ४ͷઃܭ ͳͥ143 ʹͳͬͨͷ͔
ͨͳ͔ͻͯ͞Δ @tanakahisateru ॴ
IUUQTTQFBLFSEFDLDPNUBOBLBIJTBUFSVXFIBWFQTS ڈͷ࠙ձͰ͜Μͳ͜ͱͬͯ ͔ͬ͢Γ143ຊΤόϯδΣϦετͰ͢ ·͡Ͱ࠷ۙதͷਓʹόϨͨ
͝ҙ w ;FOE&YQSFTTJWFͷ͍ํΓ·ͤΜ w 143ͷ)551ϝοηʔδϯάͷઃܭΛ௨ͯ͡ w ઃܭͷΤοηϯεΛֶͼऔΔ͜ͱΛతͱ͠·͢
ΠϯλʔϑΣʔεͷఆٛͳΜܾͯΊͷͰ͠ΐ
ΠϯλʔϑΣʔεͷఆٛͳΜܾͯΊͷͰ͠ΐ Μͳͨ͜ͶʔΑ
ϲ݄ ͨͱ͑143ͷऩଋʹ͔͔ͬͨ࣌ؒ ʙ
w ϛϡʔλϒϧWTΠϛϡʔλϒϧ w ׳शΛ͍ٙຊ࣭Λݟग़͢ w ։์ดݪଇ͔Β҆ఆநՁݪଇ·Ͱ w நͷσβΠϯ ઃܭ ͕ͦ͜ຊ࣭
͜ͷ͍ظؒͰԿ͕ܾ·͔͔ͬͨΒʜ ʜͬͯ͠Α͏ͱͯͨ͠ΜͰ͚͢Ͳ
Ϊϟʔ
None
ཱͨͣͷڠௐੑͳ͍ϑϨʔϜϫʔΫج൫ͩͱ͔ʜ
ߦಈنൣŗŕʜ ͊ ͓·͕͍͎͑ʜ
ʮ͚ͯ͠;FOEͷΤΰͰͳ͍ʯ ࢲ͕Ҏલ͔Βओு͔ͨͬͨ͠ͷɺ143͔Β࢝·ͬͨઃܭ͕ ͱ͍͏͜ͱͰ͢ ͱ͍
/ZIPMN :JJBMQIB (V[[MF 4MJN ;FOE ͪΐͬͱͷ࠷࣮ 4MJN࣍͜Ε͏͔ͱ͔ݴͬͯΔ ࣍ੈ:JJͷ)551·ΘΓ 143Λ࣮͢ΔΑ͏ʹͳΔ ΄Β͜ͷτοϓ
্͕ΓΛΑ͘ݟΖ )551ϝοηʔδϯάͦ͜ ૬ޓӡ༻ੑͷతͳଘࡏ͡Όͳ͍͔ ʜͱɺͳ͍ͥ͑Δͷ͔
8): ͳͥඞཁͳͷ͔
͜ΕΛݟͯΈͳ͞ΜͲ͏ࢥΘΕ·͔͢ -BSBWFM4XPPMF͋ΔΑͱ͍͏ͷͱҙຯ͕ҧ͍·͢
&NJUUFS*OUFSGBDF 4BQJ&NJUUFS 4XPPMF&NJUUFS 3FRVFTU)BOEMFS*OUFSGBDF ϑϨʔϜϫʔΫ "QBDIF'1. 4XPPMF ૄ݁߹ͳΞʔΩςΫνϟ ͜͜Ͱ&NJUUFS͕ࠩ͠ସΘͬͯ ϑϨʔϜϫʔΫมΘΒͳ͍
։์ดݪଇ
&NJUUFS*OUFSGBDF 4BQJ&NJUUFS 4XPPMF&NJUUFS 3FRVFTU)BOEMFS*OUFSGBDF ϑϨʔϜϫʔΫ "QBDIF'1. 4XPPMF ֤ϑϨʔϜϫʔΫ͕ $BLF1)1YΛ࠶ൃ໌ ͢Δͷ͏ͨ͘͞Μͩ
ผͷઐ༻ϑϨʔϜϫʔΫ
ݴ͍͔ͨ͊ͳ͍͚Ͳ͜ΕΑ &TQSFTTP3FBDU1)1 4JMFY TZNGPOZIUUQGPVOEBUJPO ͳΜͰ͜ΜͳʹՄೳੑ͋ͬͨϓϩδΣΫτ͕ࢭ·ͬͯ͠·ͬͨΜͰ͠ΐ͏͔ͱ
ϑϨʔϜϫʔΫͱ ΤϛολͷϥούϥΠϒϥϦͰͳ͍ ʹରͯ͠࠷దͳ ղܾͷΈந ϋʔυίʔυ͞Εͨ
Ҋ݅ݻ༗ͳۀ্ͷ՝ ղܾͲͷͰෳࡶ͞Λ෧͡Δ͔ ͱղ๏ʹଟ༷ੑ͕͋Δ͔Βͦ͜ 1)1ͱ1)1'*(ͷҙຯ͕͋Δ ϑϨʔϜϫʔΫબࢶ͕ଟ͍1)1ͷଘࡏҙٛͪΌ͍·͔͢͜Ε
@(&5<>FDIP ϑϨʔϜϫʔΫ %# %* 7JFX .7$ શһ͕ಉ͡Χλνͨ͠ͷͰڝ૪ͯ͠ҙຯͳ͍ %# %* 7JFX
.7$ %# %* 7JFX .7$ %# %* 7JFX .7$ ŹůžŢઠŹůžŢŕŞ
3FRVFTU)BOEMFS*OUFSGBDF ϑϨʔϜϫʔΫ 3%# $BDIF -PH %PNBJO.PEFM )5.- "TZOD 6*69 %FTJHO1BUUFSO
.77. $234 "%0 $MFBO "SDIJUFDUVSF 5FTU $POpHVSBUJPO ࠓޙͷϑϨʔϜϫʔΫʹ ҙࣝͯ͠΄͍͠ྖҬ ͔͜͜ΒԼδΣωϦοΫͳͳΒ αʔυύʔςΟͰͥΜͥΜ͍͍Α %*$POUBJOFS 3PVUJOH )551.FTTBHJOH %%%%$*
&NJUUFS*OUFSGBDF 4BQJ&NJUUFS 4XPPMF&NJUUFS 3FRVFTU)BOEMFS*OUFSGBDF ϑϨʔϜϫʔΫ "QBDIF'1. 4XPPMF ૄ݁߹ͳΞʔΩςΫνϟ ϑϨʔϜϫʔΫ࡞Δͱ͖ ͔͜͜ΒԼ͍ͬͨΜΕͯ
ந্͍͛ͯ͜͏Α ͜͜ΈΜͳ͕ ࠶ར༻Ͱ͖ΔΑ͏ʹ ͚ͯߟ͑Α͏ͥ
)08 ඞཁੑͲͷΑ͏ʹຬͨ͞ΕΔ͔
143 ϝοηʔδͷσʔλϞσϧ 143 143 ϝοηʔδͷϋϯυϦϯά ϝοηʔδͷੜ 3FRVFTU*OUFSGBDF3FTQPOTF*OUFSGBDF 6SJ 4USFBN 6QMPBEFE'JMF
3FRVFTU)BOEMFS*OUFSGBDF .JEEMFXBSF*OUFSGBDF 3FTQPOTF'BDUPSZ*OUFSGBDF 4USFBN'BDUPSZ*OUFSGBDF
XJUI)FBEFS OBNF WBMVF HFU#PEZ 4USFBN*OUFSGBDF .FTTBHF*OUFSGBDF 3FRVFTU*OUFSGBDF 3FTQPOTF*OUFSGBDF 143
4USFBN*OUFSGBDF SFBE MFOHUI TUSJOH FYUFOET
XJUI)FBEFS ΠϛϡʔλϏϦςΟ ࣗΛมߋͤͣɺࣗͷϔομͱՃϔομΛ ࣋ͬͨ৽͍͠ΠϯελϯεΛฦ͢ 4USFBN*OUFSGBDF ԆಡΈग़͠ந ϝϞϦʹશ༰ΛཷΊࠐ·ͳ͍͍ͯ͘ 1)1ׂϝϞϦΑΓେ͖͍όΠτྻΛѻ͑Δ 143ͷϙΠϯτ
SFRVFTUTFU1BSBN bGPP` CBS ͠ϛϡʔλϒϧͩͬͨΒʜ
@(&5<bGPP`>CBS ͠ϛϡʔλϒϧͩͬͨΒʜ ಉҰͷϦΫΤετΠϯελϯεΛ͍ճ͢͜ͱ 1)1ͷ࣮ߦ࣌ʹεʔύʔάϩʔόϧͱಉ͡ҙຯ ͜ΜͳͷͰαʔυύʔςΟؒͷ૬ޓӡ༻ੑΛҡ࣋Ͱ͖Δ͔ෆ҆
ετϦʔϛϯάʹ͍ͭͯͪ͜ΒΛ͝ཡ͍ͩ͘͞ IUUQQTSOFUTBTF[BLJQIQDPOGVL IUUQTXXXTMJEFTIBSFOFUTBTF[BLJQIQIUUQ ཁɺඞͣετϦʔϛϯάΛఆ͠Ζͱ͢Δ͜ͱͰɺ ڊେ*0Ͱྫ֎ͳ͘ѻ͑ΔΑ͏ྀ͞Ε͍ͯ·͢ (V[[MFźŕŦŖ
IBOEMF 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU 3FTQPOTF*OUFSGBDF 3FRVFTU)BOEMFS*OUFSGBDF 143 QSPDFTT 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU
3FRVFTU)BOEMFS*OUFSGBDFIBOEMFS 3FTQPOTF*OUFSGBDF .JEEMFXBSF*OUFSGBDF ϛυϧΣΞͷ༷ͱࢥΘΕ ͕͚ͪͩͲɺΉ͠Ζ͍ͭ͜ͷ ൃݟͷํ͕ॏཁ
app.get('/', function (req, res) { res.send('Hello World!'); }); app.use(function (req,
res, next) { console.log('LOGGED'); next(); }); ·ͣͪ͜ΒΛ͝ཡ͍ͩ͘͞ 143ͷॳظҊ͜͏͍͏/PEFKTͷΑ͏ͳܗΛ͍ͯ͠·ͨ͠ɻ 4MJNͷ࣮ΛҰൠԽͨ͠ײ͡Ͱ͢ɻ ϦϦʔε͞Εͨܗͱ͍ͩͿҧ͍·͢ɻ
w ͳͥϦΫΤετϋϯυϥ͕ʮϦΫΤετΛड͚ͯϨεϙϯε Λฦ͢ʯͱ͍͏ૉͳܗΛ͍ͯ͠ͳ͍ͷ͔ w ڞ༗Πϯελϯεͷঢ়ଶ͕มԽͨ͠Γɺଈ࠲ʹετϦʔϜʹ ϓογϡͨ͠Γ͢Δͷɺ143લఏͰ͜Εʜ app.get('/', function (req, res)
{ res.send('Hello World!'); });
w OFYU ͕Կऀ͔ΛܕͰද͍ͤͯͳ͍ɻʮ@@JOWPLFΛ࣋ͭ ΦϒδΣΫτʯͳͲͱ͍͏ܕͳ͍ w DBMMBCMFͳ͚ͩͰҾͷܕͷ੍͕༩͑ΒΕͳ͍ app.use(function (req, res, next)
{ console.log('LOGGED'); next(); });
w ͔ͨ͠ʹɺଟ͘ͷϑϨʔϜϫʔΫ͕&YQSFTTͷϛυϧΣΞ ʹӨڹΛड͚ͨաڈ͋Δɻ1)1Ͱͦͷํ͕ଟͩͬͨ w Ͱɺ/PEFKTͷಈ࡞ಛੑʹରͯ͠ઃܭ͞ΕͨͷΛɺΦϒ δΣΫτࢦݴޠ1)1͕ࢀߟʹ͢Δͷ͓͔͍͠ w ʮΠϯϥΠϯؔͻͱͭͰ؆୯ʹͰ͖Δʯͷʮ؆୯ʯɺ νϡʔτϦΞϧͰ༗ޮͰɺݱͰ᠘ʹԽ͚Δ͍͕ϓϯ ϓϯ͢Δࢥ
w ߟ͑ͤIUUQTCMPHJSDNBYFMMDPNBMM BCPVUNJEEMFXBSFIUNM
QSPDFTT 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU 3FRVFTU)BOEMFS*OUFSGBDFIBOEMFS 3FTQPOTF*OUFSGBDF .JEEMFXBSF*OUFSGBDF ͦͯ͜͠͏ͳͬͨ
app.use(function (req, res, next) { console.log('LOGGED'); next(); }); $middleware =
new class($logger) implements MiddlewareInterface { // ུ public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { $this->logger->log(LogLevel::INFO, 'LOGGED'); return $handler->handle($request); } }; ೖྗϦΫΤετ ࣍ͷεςοϓͷϙΠϯλʔ ग़ྗϨεϙϯε
w IBOEMFSඞͣIBOEMF ϝιουΛ࣋ͭอূ͕͋Δ w IBOEMF ϝιουͷҾʹܕ੍͕͋Δ w IBOEMF ϝιου͕ϨεϙϯεΛฦ͢อূ͕͋Δ return
$handler->handle($request); IBOEMF 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU 3FTQPOTF*OUFSGBDF 3FRVFTU)BOEMFS*OUFSGBDF ܕͷ͔ͪΒ
IBOEMF 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU 3FTQPOTF*OUFSGBDF 3FRVFTU)BOEMFS*OUFSGBDF ͭ·Γ8FCΞϓϦέʔγϣϯ ൚Խ ʜ͋ɺͦ͏Ͷɺͯ͢ͷΞϓϦέʔγϣϯཁ͢Δʹ ϦΫΤετΛड͚ͯϨεϙϯεΛฦ͚ͩͩ͢ΑͶ ϦΫΤετΛड͚ͯ
ϨεϙϯεΛฦ͢ʜ
"QQ IBOEMF 1SPYZ QSPDFTT ϦΫΤετ Ϩεϙϯε 1SPYZ"QQؒͰɺಉҰͷϝοηʔδΠϯελϯεΛڞ༗͠ͳ͍͜ͱ͕ॏཁ ح͘͠143 ཧαʔόʔߏͱಉ͡ߏਤʹ ετϦʔϛϯά
ετϦʔϛϯά 3FRVFTU)BOEMFS*OUFSGBDF .JEEMFXBSF*OUFSGBDF $PQZXJUITUSFBNJOH $PQZXJUITUSFBNJOH
ݱঢ়ͷྲྀߦΓʹଥڠͤͣͪΌΜͱઃܭ͠Α͏ͱͨ͠Β ͳΜ͔ݱ࣮ͷࣸ૾ʹ͍ۙϞσϧ͕ग़͖ͯͨͧ ͪΐͬͱײಈͳΜͰ͚͢Ͳ ߟ͑ͯ͠ຊʹྑ͔ͬͨ
͋ͱͪΐͬͱΓͳ͍͜ͱ
DSFBUF3FTQPOTF DPEF ʜ 3FTQPOTF*OUFSGBDF 3FTQPOTF'BDUPSZ*OUFSGBDF 143 4USFBN'BDUPSZ*OUFSGBDF 3FRVFTU'BDUPSZ*OUFSGBDF ʜ
$handler = new class implements RequestHandlerInterface { public function handle(
ServerRequestInterface $request ): ResponseInterface { // ͳʹ͔Λॲཧ͢Δ return new } }; ͋Ε ͜͜Ͳ͏͢Μͩ
return (new \Zend\Diactoros\Response()) ->withHeader( ‘Content-Type', ‘application/json' ) ->withBody( new \Zend\Diactoros\Stream($data)
); ʜ͑ ͜ΕͩΊ ͩΊͰ͢
143 "QQ SEQBSUZ *NQMFNFOUBUJPO ͔ͤͬ͘ΠϯλʔϑΣʔεʹґଘͯ͠ ࣮ϥΠϒϥϦΑΓ"QQ͕ ந্ʹͳΕΔͷʹ ґଘ ࣮ ΠϯϑϥετϥΫνϟ
ΞϓϦέʔγϣϯ ۀքඪ४ͷந ࠷҆ఆ
143 "QQ SEQBSUZ *NQMFNFOUBUJPO ࢀরͨ͠Β҆ఆநՁݪଇͷҧ ඪ४ΠϯλʔϑΣʔεແ͠ ґଘ ࣮ ΠϯϑϥετϥΫνϟ ΞϓϦέʔγϣϯ
ۀքඪ४ͷந ࠷҆ఆ ґଘ
class MyAppHandler implements RequestHandlerInterface { private $responseFactory; private $streamFactory; public
function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) { $this->responseFactory = $responseFactory; $this->streamFactory = $streamFactory; } public function handle( ServerRequestInterface $request ): ResponseInterface { // ུ return $this->responseFactory->createResponse() ->withHeader('Content-Type', 'application/json') ->withBody($this->streamFactory->createStream($data)); } };
public function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) ίϯετϥΫλͷ͋ͨΓͰ ҙʹ%*
ґଘੑೖ ظͯ͠Δ͚ͩͰ͢ ͨͿΜબͨ͠143ͷ࣮ϥΠϒϥϦΛೖͯ͘͠ΕΔ
return $this->responseFactory->createResponse() ->withHeader( ‘Content-Type', ‘application/json' ) ->withBody( $this->streamFactory->createStream($data) ); ۩ΛOFXͤͣɺੜ
நϑΝΫτϦʹͤΔ Ͳͷ࣮ϥΠϒϥϦΛ͏ͷ͔Λ ͍͍ͬ͞ؾʹͤͣࣗͷίʔυ͕͢Δ
143 "QQ SEQBSUZ *NQMFNFOUBUJPO ,&&1 ґଘ ࣮ ΠϯϑϥετϥΫνϟ ΞϓϦέʔγϣϯ ۀքඪ४ͷந
࠷҆ఆ
·ͱΊ
class MyAppHandler implements RequestHandlerInterface { private $responseFactory; private $streamFactory;
public function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) { $this->responseFactory = $responseFactory; $this->streamFactory = $streamFactory; } public function handle( ServerRequestInterface $request ): ResponseInterface { // ུ return $this->responseFactory->createResponse() ->withHeader('Content-Type', 'application/json') ->withBody($this->streamFactory->createStream($data)); } };
class MyAppHandler implements RequestHandlerInterface { private $responseFactory; private $streamFactory; public
function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) { $this->responseFactory = $responseFactory; $this->streamFactory = $streamFactory; } public function handle( ServerRequestInterface $request ): ResponseInterface { // ུ return $this->responseFactory->createResponse() ->withHeader('Content-Type', 'application/json') ->withBody($this->streamFactory->createStream($data)); } };
class MyAppHandler implements RequestHandlerInterface { private $responseFactory; private $streamFactory; public
function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) { $this->responseFactory = $responseFactory; $this->streamFactory = $streamFactory; } public function handle( ServerRequestInterface $request ): ResponseInterface { // ུ return $this->responseFactory->createResponse() ->withHeader('Content-Type', 'application/json') ->withBody($this->streamFactory->createStream($data)); } };
Α͏Θ͔ΒΜ͚Ͳ ͋ΜͨͷϜζ͍Θ ʮΈΜͳ͚ͷΘ͔Γ͍ͭ͢ͳ͍ͷ ʯ Ͱɺ͍͍ͷͰ͠ΐ͏͔
ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ େࣄͳ͜ͱͳͷͰ
ϦϑΝΫλ͕ཁΔ ͋ͱͰޮ͍ͯ͘Δ ࠓಈ͍ͯΔ͔Β͍͍͡ΌΜ ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ
େࣄͳ͜ͱͳͷͰ