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ϝιου͕͋Ε͹Α͍ͷͰ  DPOUSPMMFS΋NJEEMFXBSF΋  ίϯετϥΫλΠϯδΣΫγϣϯ  ೚ҙͷΠϯελϯεΛ౉ͤΔ  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

͋Γ͕ͱ͏͍͟͝·ͨ͠ ࣭໰͕͋Ε͹Ͳ͏ͧ