Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのか
Hisateru Tanaka
December 15, 2018
Technology
8
3k
PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのか
PHPカンファレンス2018 発表資料です
Hisateru Tanaka
December 15, 2018
Tweet
Share
More Decks by Hisateru Tanaka
See All by Hisateru Tanaka
tanakahisateru
7
350
tanakahisateru
26
24k
tanakahisateru
20
4.7k
tanakahisateru
0
11k
tanakahisateru
99
51k
tanakahisateru
5
1.5k
tanakahisateru
4
1.4k
tanakahisateru
0
230
tanakahisateru
3
690
Other Decks in Technology
See All in Technology
kahara33
0
130
aditya45
2
2.5k
hololab
0
240
shirayanagiryuji
1
280
ido_kara_deru
1
140
minma
0
220
ippey
2
220
ayanadesu
0
450
ishiayaya
PRO
0
230
iwashi
1
210
joytomo
0
110
ayatokura
0
100
Featured
See All Featured
destraynor
146
19k
roundedbygravity
242
21k
colly
66
3k
sachag
446
36k
kastner
54
1.9k
michaelherold
225
8.5k
reverentgeek
27
2k
marktimemedia
7
400
tmm1
61
9.4k
holman
288
130k
sferik
610
55k
bkeepers
52
4.2k
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)); } };
Α͏Θ͔ΒΜ͚Ͳ ͋ΜͨͷϜζ͍Θ ʮΈΜͳ͚ͷΘ͔Γ͍ͭ͢ͳ͍ͷ ʯ Ͱɺ͍͍ͷͰ͠ΐ͏͔
ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ େࣄͳ͜ͱͳͷͰ
ϦϑΝΫλ͕ཁΔ ͋ͱͰޮ͍ͯ͘Δ ࠓಈ͍ͯΔ͔Β͍͍͡ΌΜ ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ
େࣄͳ͜ͱͳͷͰ