Slim Frameworkで始めるPHPのmiddleware
by
YAMAOKA Hiroyuki
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
4MJN'SBNFXPSLͰ࢝ΊΔ 1)1ͷNJEEMFXBSF 1)1ΧϯϑΝϨϯεؔ ߹ಉձࣾςϯϚυɹࢁԬ
Slide 2
Slide 2 text
ࣗݾհ ࢁԬ!IJSP@Z 1)1ͱ͔/PEFKTͱ͔ॻ͖·͢ Ұ൪͖ͳͷ$44 ߹ಉձࣾςϯϚυදࣾһ
Slide 3
Slide 3 text
߹ಉձࣾςϯϚυ ݄ઃཱʢظʣ දࣾһਓ!! Ϗδωεࢧԉࣄۀ αʔϏε։ൃࣄۀ JSVDBNJNFNPDPOBTV
Slide 4
Slide 4 text
NJEEMFXBSFͱʁ ͱ͍͏Λ͠·͢
Slide 5
Slide 5 text
XFCΞϓϦέʔγϣϯͱ )551ͷϦΫΤετΛड͚औΓ ͍Ζ͍ΖॲཧΛͯ͠ ೝূͱ͔%#ʹσʔλอଘͱ͔ ͍ΘΏΔϏδωεϩδοΫ )551ͷϨεϙϯεΛฦ͢
Slide 6
Slide 6 text
؆୯ʹඳ͘ͱ͜͏
Slide 7
Slide 7 text
ϑΟϧλʔͱ͍͏ൃ શϦΫΤετڞ௨ͷॲཧ ॲཧલͷϩάΠϯೝূ ॲཧલͷσʔλऔಘɹͳͲ ΞϓϦέʔγϣϯຊମͷલʹ ॲཧΛڬΊΔΑ͏ʹ͢ΕΑ͍ͷͰ
Slide 8
Slide 8 text
ϑΟϧλʔʢલॲཧʣ
Slide 9
Slide 9 text
ϑΟϧλʔͷൃɺଓ͖ શϦΫΤετڞ௨ͷॲཧɺ·ͩ͋Δ ॲཧޙͷϩΪϯά ॲཧޙʹ·ͱΊͯϝʔϧૹ৴ ΞϓϦέʔγϣϯຊମͷޙʹ ॲཧΛڬΊΔΑ͏ʹ͢Ε͍͍ΑͶ
Slide 10
Slide 10 text
ϑΟϧλʔʢޙॲཧʣ
Slide 11
Slide 11 text
͜͜Ͱ/PEFKTͷ &YQSFTTͷΛ͠·͢
Slide 12
Slide 12 text
&YQSFTT IUUQFYQSFTTKTDPN l'BTU VOPQJOJPOBUFE NJOJNBMJTUXFCGSBNFXPSLGPS /PEFKTz /PEFKTͰҰ൪ΘΕ͍ͯΔ XFCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
Slide 13
Slide 13 text
)FMMP8PSME const express = require('express'); const app = express(); app.get('/', function(req, res) { res.send('Hello World!'); }); app.listen(3000);
Slide 14
Slide 14 text
͖ͬ͞ͷਤ
Slide 15
Slide 15 text
&YQSFTTͷߏ SPVUJOH ϦΫΤετΛॲཧʹϚοϐϯά NJEEMFXBSF SPVUJOHͷաఔͰ ҙͷॲཧΛࠩ͠ࠐΉͨΊͷΈ
Slide 16
Slide 16 text
&YQSFTTͷNJEEMFXBSF ͍Ͳ͜Ζ ڞ௨ॲཧʢલॲཧɺޙॲཧʣ ͭͷSPVUJOHʹରͯ͠ෳ࿈݁Ͱ͖Δ OFYUDBMMCBDLΛݺͿͱ ࣍ͷNJEEMFXBSFʹॲཧ͕ҠΔ ࣮ߦͷॱংએݴॱ
Slide 17
Slide 17 text
NJEEMFXBSFͷجຊ function(req, res, next) { // Կ͔લॲཧΛ͢Δ next(); // ࣍ͷmiddlewareΛݺͿ // Կ͔ޙॲཧΛ͢Δ };
Slide 18
Slide 18 text
NJEEMFXBSFͷྫ const myLogger = function(req, res, next) { console.log('Logged!'); next(); }; app.get('/', myLogger, function(req, res) { res.send('Hello World!'); });
Slide 19
Slide 19 text
NJEEMFXBSFͷྫ શ const myLogger = function(req, res, next) { console.log('Logged!'); next(); }; app.use(myLogger); // શϦΫΤετʹద༻ app.get('/', function(req, res) { res.send('Hello World!'); });
Slide 20
Slide 20 text
ೖΕࢠʹͳ͍ͬͯΔ
Slide 21
Slide 21 text
NJEEMFXBSFͷྫʢෳʣ const auth = function(req, res, next) {}; const logger = function(req, res, next) {}; app.get('/', auth, logger, function(req, res) { res.send('Hello World!'); });
Slide 22
Slide 22 text
NJEEMFXBSFͷྫʢʁʣ const myLogger = function(req, res) { console.log('Logged!'); }; app.get('/', function(req, res, next) { res.send('Hello World!'); next(); }, myLogger); // ॲཧ࣮ߦޙʹݺΕΔ
Slide 23
Slide 23 text
͋ΒΏΔॲཧ͕ NJEEMFXBSFͱͯ͠ ࣮ɾ࣮ߦ͞ΕΔੈք
Slide 24
Slide 24 text
ೖΕࢠঢ়ଶ
Slide 25
Slide 25 text
λϚωΪΈ͍ͨʁ QIPUPCZEBSXJO#FMMMJDFOTFEVOEFS$$#: IUUQTXXXqJDLSDPNQIPUPTEBSXJOCFMM
Slide 26
Slide 26 text
Ұํ1)1Ͱ ʢؼ͖ͬͯͨʂʣ
Slide 27
Slide 27 text
4UBDL1)1 IUUQTUBDLQIQDPN l$PNQPTJOH)UUQ,FSOFM*OUFSGBDF NJEEMFXBSFTTJODFz l8IBUEPXFXBOU 3FVTFBUUIF XFCMBZFSz 4ZNGPOZͷ)UUQ,FSOFM*OUFSGBDF
Slide 28
Slide 28 text
4UBDL1)1
Slide 29
Slide 29 text
ͰͦΖͦΖ 4MJN'SBNFXPSLͷ
Slide 30
Slide 30 text
4MJN'SBNFXPSLW IUUQTXXXTMJNGSBNFXPSLDPN )5513PVUFS .JEEMFXBSF 1434VQQPSU %FQFOEFODZ*OKFDUJPO
Slide 31
Slide 31 text
143 IUUQXXXQIQpHPSHQTSQTS )551NFTTBHFJOUFSGBDFT 1TSa)UUQa.FTTBHFa3FRVFTU*OUFSGBDF 1TSa)UUQa.FTTBHFa3FTQPOTF*OUFSGBDF XFCΞϓϦͷೖग़ྗͷඪ४Խ
Slide 32
Slide 32 text
)FMMP8PSME // autoloadͱ͔useলུ… $app = new \Slim\App(); $app->get('/', function($request, $response) { $response->getBody() ->write('Hello World!'); return $response; }); $app->run();
Slide 33
Slide 33 text
؆୯Ͱ͠ΐʁ
Slide 34
Slide 34 text
͍Α͍Α NJEEMFXBSFͷ
Slide 35
Slide 35 text
NJEEMFXBSFʢؔʣ function(Request $request, Response $response, callable $next): Response { // Կ͔લॲཧΛ͢Δ $response = $next($request, $response); // Կ͔ޙॲཧΛ͢Δ return $response; };
Slide 36
Slide 36 text
NJEEMFXBSFʢΫϥεʣ class ExampleMiddleware { public function __invoke( Request $request, Response $response, callable $next ): Response { // …ؔͷͱ͖ͱಉ͡ } }
Slide 37
Slide 37 text
NJEEMFXBSFͷద༻ $app->get('/', function($request, $response) { // Կ͔ॲཧͯ͠ResponseΛฦ͢ })->add(ExampleMiddleware::class); // ͠શॲཧʹڬΉͳΒ $app->add(ExampleMiddleware::class);
Slide 38
Slide 38 text
DPOUSPMMFS // $app->get('/', ExampleAction::class); class ExampleAction { public function __invoke( Request $request, Response $response, array $args): Response { return $response; } }
Slide 39
Slide 39 text
%*ίϯςφͱ Έ߹ΘͤΔͱ ͬͱศརʹ
Slide 40
Slide 40 text
4MJNͷ%*ίϯςφͷҐஔ͚ Πϯελϯεੜ%*ίϯςφͷ ͖ͳ%*ίϯςφʹࠩ͠ସ͑Մೳ 1JNQMF1)1%*"DDMJNBUF $POUBJOFS*OUFSPQ࣮ͷίϯςφ 143࣮ͷίϯςφʢ͔Βʣ
Slide 41
Slide 41 text
%*ίϯςφͱͷ૬ੑ @@JOWPLFϝιου͕͋ΕΑ͍ͷͰ DPOUSPMMFSNJEEMFXBSF ίϯετϥΫλΠϯδΣΫγϣϯ ҙͷΠϯελϯεΛͤΔ NPEFMΫϥεͱ͔ɺSFOEFSFSͱ͔
Slide 42
Slide 42 text
DPOUSPMMFS /** @var \Slim\Views\Twig */ private $view; public fucntion __construct(Twig $view) { $this->view = $view; } public function __invoke(Request $request, Response $response, array $args): Response { return $this->view->render($response, 'foo.twig'); }
Slide 43
Slide 43 text
Λͯ͠ɺ143ͷ
Slide 44
Slide 44 text
ؔ͋Γͦ͏ͳ143 IUUQXXXQIQpHPSHQTS 1)14UBOEBSET3FDPNNFOEBUJPOT 143)551.FTTBHF*OUFSGBDF"DDFQUFE 143$POUBJOFS*OUFSGBDF"DDFQUFE 143)551.JEEMFXBSFT%SBGU
Slide 45
Slide 45 text
143 "DDFQUFE %*ίϯςφͷJOUFSGBDFͷඪ४Խ 1TSa$POUBJOFSa$POUBJOFS*OUFSGBDF HFUͱIBTͷϝιουΛ࣋ͭ
Slide 46
Slide 46 text
143 %SBGU .JEEMFXBSF*OUFSGBDF NJEEMFXBSFࣗମʹؔ͢Δͷ %FMFHBUF*OUFSGBDF ҕઌίΞͷΞϓϦϨΠϠʔʁ ·ͩٞͷߦํ͕ఆ·͍ͬͯͳ͍
Slide 47
Slide 47 text
1)1ͷNJEEMFXBSFྲّྀ %PVCMF1BTT 4MJNͬͪ͜ GO SFRVFTU SFTQPOTF OFYU SFTQPOTF 4JOHMF1BTT GO SFRVFTU OFYU SFTQPOTF
Slide 48
Slide 48 text
.JEEMFXBSF*OUFSGBDF namespace Psr\Http\ServerMiddleware; interface MiddlewareInterface { public function process( ServerRequestInterface $request, DelegateInterface $delegate ): ResponseInterface; }
Slide 49
Slide 49 text
%FMFHBUF*OUFSGBDF namespace Psr\Http\ServerMiddleware; interface DelegateInterface { public function process( ServerRequestInterface $request ): ResponseInterface; }
Slide 50
Slide 50 text
ଞͷϑϨʔϜϫʔΫͷ߹
Slide 51
Slide 51 text
-BSBWFM IUUQTMBSBWFMDPNEPDT NJEEMFXBSF 143ͳͲҙ͍ࣝͯ͠ͳ͍ ैདྷͷDPOUSPMMFSͷิॿతͳׂ ڞ௨ॲཧΛ࣮͢ΔͨΊͷΈ
Slide 52
Slide 52 text
-BSBWFMྫ class CheckAge { public function handle( \Illuminate\Http\Request $request, \Closure $next) { // Կ͔ॲཧʢલͰޙΖͰʣ return $next($request); } } Route::get('/', function() { /* ॲཧ */ }) ->middleware(CheckAge::class);
Slide 53
Slide 53 text
$BLF1)1 $BLF1)1͔ΒNJEEMFXBSF͕͋Δ ࣮ํ๏4MJNͱ΄ͱΜͲಉ͕ͩ͡ɺ ਖ਼͜ͳΕ͍ͯͳ͍ײ͡ ΫϥεͰͳ͘ΠϯελϯεΛ͢ IUUQTXXXTMJEFTIBSFOFUNBSLTUPSZ DBLFQIQUIFSPBEBIFBE
Slide 54
Slide 54 text
4ZNGPOZ NJEEMFXBSFʹ૬͢Δػೳͳ͍ ػೳͱͯ͠ϑΟϧλʔ͕͋Δ 4JMFYͰNJEEMFXBSFͱݺͿͷ͋Δ ͕ɺ͍ΘΏΔϑΟϧλʔͰ͔͠ͳ͍
Slide 55
Slide 55 text
;FOE&YQSFTTJWF IUUQTEPDT[FOEGSBNFXPSLDPN [FOEFYQSFTTJWF 143.JEEMFXBSF3PVUJOH%* 143ͳͲͷඪ४Λҙࣝ BDUJPOΫϥεNJEEMFXBSFͱ࣮ͯ͠
Slide 56
Slide 56 text
;FOE&YQSFTTJWFྫ $helloMiddleware = function ( ServerRequestInterface $request, DelegateInterface $delegate ) { return new TextResponse('Hello', 200); }; // ͋Δ͍MiddlewareInterfaceΛ࣮ͨ͠Ϋϥε $app->get('/hello', $hellosMiddleware);
Slide 57
Slide 57 text
NJEEMFXBSF ͍͔͕Ͱ͔ͨ͠ʁ
Slide 58
Slide 58 text
·ͱΊ NJEEMFXBSFͱ͍͏ߟ͑ํΛΔ͜ͱ ॲཧΛNJEEMFXBSFͰׂ➡ςετ༰қੑ 143Ͱඪ४Խ͞ΕΔ͜ͱͰࠩ͠ସ͑Մೳʹ %*ίϯςφͱͷΈ߹Θͤɺศར 4MJNͱ͔;FOE&YQSFTTJWF໘ന͍Αʂ
Slide 59
Slide 59 text
͋Γ͕ͱ͏͍͟͝·ͨ͠ ࣭͕͋ΕͲ͏ͧ