2017年7月17日、PHPカンファレンス関西2017での発表資料です。 https://2017.kphpug.jp/
4MJN'SBNFXPSLͰ࢝ΊΔ 1)1ͷNJEEMFXBSF1)1ΧϯϑΝϨϯεؔ ߹ಉձࣾςϯϚυɹࢁԬ
View Slide
ࣗݾհ ࢁԬ!IJSP@Z 1)1ͱ͔/PEFKTͱ͔ॻ͖·͢ Ұ൪͖ͳͷ$44 ߹ಉձࣾςϯϚυදࣾһ
߹ಉձࣾςϯϚυ ݄ઃཱʢظʣ දࣾһਓ!! Ϗδωεࢧԉࣄۀ αʔϏε։ൃࣄۀ JSVDBNJNFNPDPOBTV
NJEEMFXBSFͱʁͱ͍͏Λ͠·͢
XFCΞϓϦέʔγϣϯͱ )551ͷϦΫΤετΛड͚औΓ ͍Ζ͍ΖॲཧΛͯ͠ ೝূͱ͔%#ʹσʔλอଘͱ͔ ͍ΘΏΔϏδωεϩδοΫ )551ͷϨεϙϯεΛฦ͢
؆୯ʹඳ͘ͱ͜͏
ϑΟϧλʔͱ͍͏ൃ શϦΫΤετڞ௨ͷॲཧ ॲཧલͷϩάΠϯೝূ ॲཧલͷσʔλऔಘɹͳͲΞϓϦέʔγϣϯຊମͷલʹ ॲཧΛڬΊΔΑ͏ʹ͢ΕΑ͍ͷͰ
ϑΟϧλʔʢલॲཧʣ
ϑΟϧλʔͷൃɺଓ͖ શϦΫΤετڞ௨ͷॲཧɺ·ͩ͋Δ ॲཧޙͷϩΪϯά ॲཧޙʹ·ͱΊͯϝʔϧૹ৴ΞϓϦέʔγϣϯຊମͷޙʹ ॲཧΛڬΊΔΑ͏ʹ͢Ε͍͍ΑͶ
ϑΟϧλʔʢޙॲཧʣ
͜͜Ͱ/PEFKTͷ&YQSFTTͷΛ͠·͢
&YQSFTT IUUQFYQSFTTKTDPN l'BTU VOPQJOJPOBUFE NJOJNBMJTUXFCGSBNFXPSLGPS/PEFKTz /PEFKTͰҰ൪ΘΕ͍ͯΔ XFCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
)FMMP8PSMEconst express = require('express');const app = express();app.get('/', function(req, res) {res.send('Hello World!');});app.listen(3000);
͖ͬ͞ͷਤ
&YQSFTTͷߏ SPVUJOH ϦΫΤετΛॲཧʹϚοϐϯά NJEEMFXBSF SPVUJOHͷաఔͰ ҙͷॲཧΛࠩ͠ࠐΉͨΊͷΈ
&YQSFTTͷNJEEMFXBSF ͍Ͳ͜Ζ ڞ௨ॲཧʢલॲཧɺޙॲཧʣ ͭͷSPVUJOHʹରͯ͠ෳ࿈݁Ͱ͖Δ OFYUDBMMCBDLΛݺͿͱ ࣍ͷNJEEMFXBSFʹॲཧ͕ҠΔ ࣮ߦͷॱংએݴॱ
NJEEMFXBSFͷجຊfunction(req, res, next) {// Կ͔લॲཧΛ͢Δnext(); // ࣍ͷmiddlewareΛݺͿ// Կ͔ޙॲཧΛ͢Δ};
NJEEMFXBSFͷྫconst myLogger = function(req, res, next) {console.log('Logged!');next();};app.get('/', myLogger, function(req, res) {res.send('Hello World!');});
NJEEMFXBSFͷྫ શconst myLogger = function(req, res, next) {console.log('Logged!');next();};app.use(myLogger); // શϦΫΤετʹద༻app.get('/', function(req, res) {res.send('Hello World!');});
ೖΕࢠʹͳ͍ͬͯΔ
NJEEMFXBSFͷྫʢෳʣconst auth = function(req, res, next) {};const logger = function(req, res, next) {};app.get('/',auth, logger, function(req, res) {res.send('Hello World!');});
NJEEMFXBSFͷྫʢʁʣconst myLogger = function(req, res) {console.log('Logged!');};app.get('/', function(req, res, next) {res.send('Hello World!');next();}, myLogger); // ॲཧ࣮ߦޙʹݺΕΔ
͋ΒΏΔॲཧ͕NJEEMFXBSFͱ࣮ͯ͠ɾ࣮ߦ͞ΕΔੈք
ೖΕࢠঢ়ଶ
λϚωΪΈ͍ͨʁQIPUPCZEBSXJO#FMMMJDFOTFEVOEFS$$#: IUUQTXXXqJDLSDPNQIPUPTEBSXJOCFMM
Ұํ1)1Ͱʢؼ͖ͬͯͨʂʣ
4UBDL1)1 IUUQTUBDLQIQDPN l$PNQPTJOH)UUQ,FSOFM*OUFSGBDFNJEEMFXBSFTTJODFz l8IBUEPXFXBOU 3FVTFBUUIFXFCMBZFSz 4ZNGPOZͷ)UUQ,FSOFM*OUFSGBDF
4UBDL1)1
ͰͦΖͦΖ4MJN'SBNFXPSLͷ
4MJN'SBNFXPSLW IUUQTXXXTMJNGSBNFXPSLDPN )5513PVUFS .JEEMFXBSF 1434VQQPSU %FQFOEFODZ*OKFDUJPO
143 IUUQXXXQIQpHPSHQTSQTS )551NFTTBHFJOUFSGBDFT 1TSa)UUQa.FTTBHFa3FRVFTU*OUFSGBDF 1TSa)UUQa.FTTBHFa3FTQPOTF*OUFSGBDF XFCΞϓϦͷೖग़ྗͷඪ४Խ
)FMMP8PSME// autoloadͱ͔useলུ…$app = new \Slim\App();$app->get('/', function($request, $response) {$response->getBody()->write('Hello World!');return $response;});$app->run();
؆୯Ͱ͠ΐʁ
͍Α͍ΑNJEEMFXBSFͷ
NJEEMFXBSFʢؔʣfunction(Request $request,Response $response,callable $next): Response { // Կ͔લॲཧΛ͢Δ$response =$next($request, $response);// Կ͔ޙॲཧΛ͢Δreturn $response;};
NJEEMFXBSFʢΫϥεʣclass ExampleMiddleware {public function __invoke(Request $request,Response $response,callable $next): Response {// …ؔͷͱ͖ͱಉ͡}}
NJEEMFXBSFͷద༻$app->get('/', function($request, $response) {// Կ͔ॲཧͯ͠ResponseΛฦ͢})->add(ExampleMiddleware::class);// ͠શॲཧʹڬΉͳΒ$app->add(ExampleMiddleware::class);
DPOUSPMMFS// $app->get('/', ExampleAction::class);class ExampleAction{public function __invoke(Request $request,Response $response,array $args): Response {return $response;}}
%*ίϯςφͱΈ߹ΘͤΔͱͬͱศརʹ
4MJNͷ%*ίϯςφͷҐஔ͚ Πϯελϯεੜ%*ίϯςφͷ ͖ͳ%*ίϯςφʹࠩ͠ସ͑Մೳ 1JNQMF1)1%*"DDMJNBUF $POUBJOFS*OUFSPQ࣮ͷίϯςφ 143࣮ͷίϯςφʢ͔Βʣ
%*ίϯςφͱͷ૬ੑ @@JOWPLFϝιου͕͋ΕΑ͍ͷͰ DPOUSPMMFSNJEEMFXBSFίϯετϥΫλΠϯδΣΫγϣϯ ҙͷΠϯελϯεΛͤΔ NPEFMΫϥεͱ͔ɺSFOEFSFSͱ͔
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');}
Λͯ͠ɺ143ͷ
ؔ͋Γͦ͏ͳ143 IUUQXXXQIQpHPSHQTS 1)14UBOEBSET3FDPNNFOEBUJPOT 143)551.FTTBHF*OUFSGBDF"DDFQUFE 143$POUBJOFS*OUFSGBDF"DDFQUFE 143)551.JEEMFXBSFT%SBGU
143 "DDFQUFE %*ίϯςφͷJOUFSGBDFͷඪ४Խ 1TSa$POUBJOFSa$POUBJOFS*OUFSGBDF HFUͱIBTͷϝιουΛ࣋ͭ
143 %SBGU .JEEMFXBSF*OUFSGBDF NJEEMFXBSFࣗମʹؔ͢Δͷ %FMFHBUF*OUFSGBDF ҕઌίΞͷΞϓϦϨΠϠʔʁ ·ͩٞͷߦํ͕ఆ·͍ͬͯͳ͍
1)1ͷNJEEMFXBSFྲّྀ %PVCMF1BTT 4MJNͬͪ͜ GO SFRVFTU SFTQPOTF OFYUSFTQPOTF 4JOHMF1BTT GO SFRVFTU OFYUSFTQPOTF
.JEEMFXBSF*OUFSGBDFnamespace Psr\Http\ServerMiddleware;interface MiddlewareInterface{public function process(ServerRequestInterface $request,DelegateInterface $delegate): ResponseInterface;}
%FMFHBUF*OUFSGBDFnamespace Psr\Http\ServerMiddleware;interface DelegateInterface{public function process(ServerRequestInterface $request): ResponseInterface;}
ଞͷϑϨʔϜϫʔΫͷ߹
-BSBWFM IUUQTMBSBWFMDPNEPDTNJEEMFXBSF 143ͳͲҙ͍ࣝͯ͠ͳ͍ ैདྷͷDPOUSPMMFSͷิॿతͳׂ ڞ௨ॲཧΛ࣮͢ΔͨΊͷΈ
-BSBWFMྫclass CheckAge {public function handle(\Illuminate\Http\Request $request,\Closure $next) {// Կ͔ॲཧʢલͰޙΖͰʣreturn $next($request);}}Route::get('/', function() { /* ॲཧ */ })->middleware(CheckAge::class);
$BLF1)1 $BLF1)1͔ΒNJEEMFXBSF͕͋Δ ࣮ํ๏4MJNͱ΄ͱΜͲಉ͕ͩ͡ɺ ਖ਼͜ͳΕ͍ͯͳ͍ײ͡ ΫϥεͰͳ͘ΠϯελϯεΛ͢ IUUQTXXXTMJEFTIBSFOFUNBSLTUPSZDBLFQIQUIFSPBEBIFBE
4ZNGPOZ NJEEMFXBSFʹ૬͢Δػೳͳ͍ ػೳͱͯ͠ϑΟϧλʔ͕͋Δ 4JMFYͰNJEEMFXBSFͱݺͿͷ͋Δ ͕ɺ͍ΘΏΔϑΟϧλʔͰ͔͠ͳ͍
;FOE&YQSFTTJWF IUUQTEPDT[FOEGSBNFXPSLDPN[FOEFYQSFTTJWF 143.JEEMFXBSF3PVUJOH%* 143ͳͲͷඪ४Λҙࣝ BDUJPOΫϥεNJEEMFXBSFͱ࣮ͯ͠
;FOE&YQSFTTJWFྫ$helloMiddleware = function (ServerRequestInterface $request,DelegateInterface $delegate) {return new TextResponse('Hello', 200);};// ͋Δ͍MiddlewareInterfaceΛ࣮ͨ͠Ϋϥε$app->get('/hello', $hellosMiddleware);
NJEEMFXBSF͍͔͕Ͱ͔ͨ͠ʁ
·ͱΊ NJEEMFXBSFͱ͍͏ߟ͑ํΛΔ͜ͱ ॲཧΛNJEEMFXBSFͰׂ➡ςετ༰қੑ 143Ͱඪ४Խ͞ΕΔ͜ͱͰࠩ͠ସ͑Մೳʹ %*ίϯςφͱͷΈ߹Θͤɺศར 4MJNͱ͔;FOE&YQSFTTJWF໘ന͍Αʂ
͋Γ͕ͱ͏͍͟͝·࣭͕ͨ͋͠ΕͲ͏ͧ