$30 off During Our Annual Pro Sale. View Details »

Slim Frameworkで始めるPHPのmiddleware

Slim Frameworkで始めるPHPのmiddleware

2017年7月17日、PHPカンファレンス関西2017での発表資料です。
https://2017.kphpug.jp/

YAMAOKA Hiroyuki

July 15, 2017
Tweet

More Decks by YAMAOKA Hiroyuki

Other Decks in Technology

Transcript

  1. 4MJN'SBNFXPSLͰ࢝ΊΔ

    1)1ͷNJEEMFXBSF
    1)1ΧϯϑΝϨϯεؔ੢

    ߹ಉձࣾςϯϚυɹࢁԬ޿޾

    View Slide

  2. ࣗݾ঺հ
    ࢁԬ޿޾!IJSP@Z
    1)1ͱ͔/PEFKTͱ͔ॻ͖·͢
    Ұ൪޷͖ͳͷ͸$44
    ߹ಉձࣾςϯϚυ୅දࣾһ

    View Slide

  3. ߹ಉձࣾςϯϚυ
    ೥݄ઃཱʢظ໨ʣ

    ୅දࣾһਓ!!
    Ϗδωεࢧԉࣄۀ
    αʔϏε։ൃࣄۀ
    JSVDBNJNFNPDPOBTV

    View Slide

  4. NJEEMFXBSFͱ͸ʁ
    ͱ͍͏࿩Λ͠·͢

    View Slide

  5. XFCΞϓϦέʔγϣϯͱ͸
    )551ͷϦΫΤετΛड͚औΓ
    ͍Ζ͍ΖॲཧΛͯ͠
    ೝূͱ͔%#ʹσʔλอଘͱ͔
    ͍ΘΏΔϏδωεϩδοΫ
    )551ͷϨεϙϯεΛฦ͢

    View Slide

  6. ؆୯ʹඳ͘ͱ͜͏

    View Slide

  7. ϑΟϧλʔͱ͍͏ൃ૝
    શϦΫΤετڞ௨ͷॲཧ
    ॲཧલͷϩάΠϯೝূ
    ॲཧલͷσʔλऔಘɹͳͲ

    ΞϓϦέʔγϣϯຊମͷલʹ

    ॲཧΛڬΊΔΑ͏ʹ͢Ε͹Α͍ͷͰ͸

    View Slide

  8. ϑΟϧλʔʢલॲཧʣ

    View Slide

  9. ϑΟϧλʔͷൃ૝ɺଓ͖
    શϦΫΤετڞ௨ͷॲཧɺ·ͩ͋Δ
    ॲཧޙͷϩΪϯά
    ॲཧޙʹ·ͱΊͯϝʔϧૹ৴

    ΞϓϦέʔγϣϯຊମͷޙʹ΋

    ॲཧΛڬΊΔΑ͏ʹ͢Ε͹͍͍ΑͶ

    View Slide

  10. ϑΟϧλʔʢޙॲཧʣ

    View Slide

  11. ͜͜Ͱ/PEFKTͷ
    &YQSFTTͷ࿩Λ͠·͢

    View Slide

  12. &YQSFTT
    IUUQFYQSFTTKTDPN
    l'BTU VOPQJOJPOBUFE
    NJOJNBMJTUXFCGSBNFXPSLGPS
    /PEFKTz
    /PEFKTͰҰ൪࢖ΘΕ͍ͯΔ

    XFCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ

    View Slide

  13. )FMMP8PSME
    const express = require('express');
    const app = express();
    app.get('/', function(req, res) {
    res.send('Hello World!');
    });
    app.listen(3000);

    View Slide

  14. ͖ͬ͞ͷਤ

    View Slide

  15. &YQSFTTͷߏ੒
    SPVUJOH
    ϦΫΤετΛॲཧʹϚοϐϯά
    NJEEMFXBSF
    SPVUJOHͷաఔͰ

    ೚ҙͷॲཧΛࠩ͠ࠐΉͨΊͷ࢓૊Έ

    View Slide

  16. &YQSFTTͷNJEEMFXBSF
    ࢖͍Ͳ͜Ζ
    ڞ௨ॲཧʢલॲཧɺޙॲཧʣ
    ͭͷSPVUJOHʹରͯ͠ෳ਺࿈݁Ͱ͖Δ
    OFYUDBMMCBDLΛݺͿͱ

    ࣍ͷNJEEMFXBSFʹॲཧ͕ҠΔ
    ࣮ߦͷॱং͸એݴॱ

    View Slide

  17. NJEEMFXBSFͷجຊ
    function(req, res, next) {
    // Կ͔લॲཧΛ͢Δ
    next(); // ࣍ͷmiddlewareΛݺͿ
    // Կ͔ޙॲཧΛ͢Δ
    };

    View Slide

  18. NJEEMFXBSFͷྫ
    const myLogger = function(req, res, next) {
    console.log('Logged!');
    next();
    };
    app.get('/', myLogger, function(req, res) {
    res.send('Hello World!');
    });

    View Slide

  19. NJEEMFXBSFͷྫ શ

    const myLogger = function(req, res, next) {
    console.log('Logged!');
    next();
    };
    app.use(myLogger); // શϦΫΤετʹద༻
    app.get('/', function(req, res) {
    res.send('Hello World!');
    });

    View Slide

  20. ೖΕࢠʹͳ͍ͬͯΔ

    View Slide

  21. NJEEMFXBSFͷྫʢෳ਺ʣ
    const auth = function(req, res, next) {};
    const logger = function(req, res, next) {};
    app.get('/',
    auth, logger, function(req, res) {
    res.send('Hello World!');
    });

    View Slide

  22. NJEEMFXBSFͷྫʢʁʣ
    const myLogger = function(req, res) {
    console.log('Logged!');
    };
    app.get('/', function(req, res, next) {
    res.send('Hello World!');
    next();
    }, myLogger); // ॲཧ࣮ߦޙʹݺ͹ΕΔ

    View Slide

  23. ͋ΒΏΔॲཧ͕
    NJEEMFXBSFͱͯ͠
    ࣮૷ɾ࣮ߦ͞ΕΔੈք

    View Slide

  24. ೖΕࢠঢ়ଶ

    View Slide

  25. λϚωΪΈ͍ͨʁ
    QIPUPCZEBSXJO#FMMMJDFOTFEVOEFS$$#:

    IUUQTXXXqJDLSDPNQIPUPTEBSXJOCFMM

    View Slide

  26. Ұํ1)1Ͱ͸
    ʢؼ͖ͬͯͨʂʣ

    View Slide

  27. 4UBDL1)1
    IUUQTUBDLQIQDPN
    l$PNQPTJOH)UUQ,FSOFM*OUFSGBDF
    NJEEMFXBSFTTJODFz
    l8IBUEPXFXBOU 3FVTFBUUIF
    XFCMBZFSz
    4ZNGPOZͷ)UUQ,FSOFM*OUFSGBDF

    View Slide

  28. 4UBDL1)1

    View Slide

  29. Ͱ͸ͦΖͦΖ
    4MJN'SBNFXPSLͷ࿩

    View Slide

  30. 4MJN'SBNFXPSLW
    IUUQTXXXTMJNGSBNFXPSLDPN
    )5513PVUFS
    .JEEMFXBSF
    1434VQQPSU
    %FQFOEFODZ*OKFDUJPO

    View Slide

  31. 143
    IUUQXXXQIQpHPSHQTSQTS
    )551NFTTBHFJOUFSGBDFT
    1TSa)UUQa.FTTBHFa3FRVFTU*OUFSGBDF
    1TSa)UUQa.FTTBHFa3FTQPOTF*OUFSGBDF
    XFCΞϓϦͷೖग़ྗͷඪ४Խ

    View Slide

  32. )FMMP8PSME
    // autoloadͱ͔use͸লུ…
    $app = new \Slim\App();
    $app->get('/', function($request, $response) {
    $response->getBody()
    ->write('Hello World!');
    return $response;
    });
    $app->run();

    View Slide

  33. ؆୯Ͱ͠ΐʁ

    View Slide

  34. ͍Α͍Α
    NJEEMFXBSFͷ࿩

    View Slide

  35. NJEEMFXBSFʢؔ਺ʣ
    function(Request $request,
    Response $response,
    callable $next): Response {

    // Կ͔લॲཧΛ͢Δ
    $response =
    $next($request, $response);
    // Կ͔ޙॲཧΛ͢Δ
    return $response;
    };

    View Slide

  36. NJEEMFXBSFʢΫϥεʣ
    class ExampleMiddleware {
    public function __invoke(
    Request $request,
    Response $response,
    callable $next
    ): Response {
    // …ؔ਺ͷͱ͖ͱಉ͡
    }
    }

    View Slide

  37. NJEEMFXBSFͷద༻
    $app->get('/', function($request, $response) {
    // Կ͔ॲཧͯ͠ResponseΛฦ͢
    })->add(ExampleMiddleware::class);
    // ΋͠΋શॲཧʹڬΉͳΒ
    $app->add(ExampleMiddleware::class);

    View Slide

  38. DPOUSPMMFS
    // $app->get('/', ExampleAction::class);
    class ExampleAction
    {
    public function __invoke(
    Request $request,
    Response $response,
    array $args): Response

    {
    return $response;
    }
    }

    View Slide

  39. %*ίϯςφͱ
    ૊Έ߹ΘͤΔͱ
    ΋ͬͱศརʹ

    View Slide

  40. 4MJNͷ%*ίϯςφͷҐஔ෇͚
    Πϯελϯεੜ੒͸%*ίϯςφͷ੹຿
    ޷͖ͳ%*ίϯςφʹࠩ͠ସ͑Մೳ
    1JNQMF1)1%*"DDMJNBUF
    $POUBJOFS*OUFSPQ࣮૷ͷίϯςφ
    143࣮૷ͷίϯςφʢ͔Βʣ

    View Slide

  41. %*ίϯςφͱͷ૬ੑ
    @@JOWPLFϝιου͕͋Ε͹Α͍ͷͰ
    DPOUSPMMFS΋NJEEMFXBSF΋

    ίϯετϥΫλΠϯδΣΫγϣϯ
    ೚ҙͷΠϯελϯεΛ౉ͤΔ
    NPEFMΫϥεͱ͔ɺSFOEFSFSͱ͔

    View Slide

  42. 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');
    }

    View Slide

  43. ࿩Λ໭ͯ͠ɺ143ͷ࿩

    View Slide

  44. ؔ܎͋Γͦ͏ͳ143
    IUUQXXXQIQpHPSHQTS
    1)14UBOEBSET3FDPNNFOEBUJPOT
    143)551.FTTBHF*OUFSGBDF"DDFQUFE

    143$POUBJOFS*OUFSGBDF"DDFQUFE

    143)551.JEEMFXBSFT%SBGU

    View Slide

  45. 143 "DDFQUFE

    %*ίϯςφͷJOUFSGBDFͷඪ४Խ
    1TSa$POUBJOFSa$POUBJOFS*OUFSGBDF
    HFUͱIBTͷϝιουΛ࣋ͭ

    View Slide

  46. 143 %SBGU

    .JEEMFXBSF*OUFSGBDF
    NJEEMFXBSFࣗମʹؔ͢Δ΋ͷ
    %FMFHBUF*OUFSGBDF
    ҕ೚ઌίΞͷΞϓϦϨΠϠʔʁ
    ·ͩٞ࿦ͷߦํ͕ఆ·͍ͬͯͳ͍

    View Slide

  47. 1)1ͷNJEEMFXBSFྲّྀ
    %PVCMF1BTT
    4MJN͸ͬͪ͜
    GO SFRVFTU SFTQPOTF OFYU
    SFTQPOTF
    4JOHMF1BTT
    GO SFRVFTU OFYU
    SFTQPOTF

    View Slide

  48. .JEEMFXBSF*OUFSGBDF
    namespace Psr\Http\ServerMiddleware;
    interface MiddlewareInterface
    {
    public function process(
    ServerRequestInterface $request,
    DelegateInterface $delegate
    ): ResponseInterface;
    }

    View Slide

  49. %FMFHBUF*OUFSGBDF
    namespace Psr\Http\ServerMiddleware;
    interface DelegateInterface
    {
    public function process(
    ServerRequestInterface $request
    ): ResponseInterface;
    }

    View Slide

  50. ଞͷϑϨʔϜϫʔΫͷ৔߹

    View Slide

  51. -BSBWFM
    IUUQTMBSBWFMDPNEPDT
    NJEEMFXBSF
    143ͳͲ͸ҙ͍ࣝͯ͠ͳ͍
    ैདྷͷDPOUSPMMFSͷิॿతͳ໾ׂ
    ڞ௨ॲཧΛ࣮૷͢ΔͨΊͷ࢓૊Έ

    View Slide

  52. -BSBWFMྫ
    class CheckAge {
    public function handle(
    \Illuminate\Http\Request $request,
    \Closure $next) {
    // Կ͔ॲཧʢલͰ΋ޙΖͰ΋ʣ
    return $next($request);
    }
    }
    Route::get('/', function() { /* ॲཧ */ })
    ->middleware(CheckAge::class);

    View Slide

  53. $BLF1)1
    $BLF1)1͔ΒNJEEMFXBSF͕͋Δ
    ࣮૷ํ๏͸4MJNͱ΄ͱΜͲಉ͕ͩ͡ɺ

    ਖ਼௚͜ͳΕ͍ͯͳ͍ײ͡
    ΫϥεͰ͸ͳ͘ΠϯελϯεΛ౉͢
    IUUQTXXXTMJEFTIBSFOFUNBSLTUPSZ
    DBLFQIQUIFSPBEBIFBE

    View Slide

  54. 4ZNGPOZ
    NJEEMFXBSFʹ૬౰͢Δػೳ͸ͳ͍
    ػೳͱͯ͠͸ϑΟϧλʔ͕͋Δ
    4JMFYͰNJEEMFXBSFͱݺͿ΋ͷ͸͋Δ
    ͕ɺ͍ΘΏΔϑΟϧλʔͰ͔͠ͳ͍

    View Slide

  55. ;FOE&YQSFTTJWF
    IUUQTEPDT[FOEGSBNFXPSLDPN
    [FOEFYQSFTTJWF
    143.JEEMFXBSF3PVUJOH%*
    143΍ͳͲͷඪ४Λҙࣝ
    BDUJPOΫϥε΋NJEEMFXBSFͱ࣮ͯ͠૷

    View Slide

  56. ;FOE&YQSFTTJWFྫ
    $helloMiddleware = function (
    ServerRequestInterface $request,
    DelegateInterface $delegate
    ) {
    return new TextResponse('Hello', 200);
    };
    // ͋Δ͍͸MiddlewareInterfaceΛ࣮૷ͨ͠Ϋϥε
    $app->get('/hello', $hellosMiddleware);

    View Slide

  57. NJEEMFXBSF
    ͍͔͕Ͱ͔ͨ͠ʁ

    View Slide

  58. ·ͱΊ
    NJEEMFXBSFͱ͍͏ߟ͑ํΛ஌Δ͜ͱ
    ॲཧΛNJEEMFXBSFͰ෼ׂ➡ςετ༰қੑ
    143Ͱඪ४Խ͞ΕΔ͜ͱͰࠩ͠ସ͑Մೳʹ
    %*ίϯςφͱͷ૊Έ߹Θͤɺศར
    4MJNͱ͔;FOE&YQSFTTJWF໘ന͍Αʂ

    View Slide

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

    View Slide