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

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