Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravelを使った既存WebサービスのAPI化

Futoshi Endo
September 13, 2018

 Laravelを使った既存WebサービスのAPI化

Laravel MeetUpTokyo #11で発表した内容になります。

https://laravel-meetup-tokyo.connpass.com/event/93838/

Futoshi Endo

September 13, 2018
Tweet

More Decks by Futoshi Endo

Other Decks in Programming

Transcript

  1. ԕ౻ଠಙ(.01FQBCP *OD
    -BSBWFM.FFU6Q5PLZP
    -BSBWFMΛ࢖ͬͨ
    طଘ8FCαʔϏεͷ"1*Խ

    View Slide

  2. ԕ౻ଠಙ ͑ΜͲ͎ʔ
    !'FOEP
    4)ࣄۀ෦(PPQFάϧʔϓ8FCΤϯδχΞ
    @Fendo181 @Fendo181

    View Slide

  3. ɾ؆୯ʹࣗ෼ͷϗʔϜϖʔδ͕࡞੒Ͱ͖Δ
    ɾࠓ೥ͰαʔϏεՔಇͯ͠೥໨

    View Slide

  4. -VNFOͰݎ࿚ͳ"1*Λઃܭ͢Δɻ
    ʲ຋༁ʳLaravelΛ5.6͔Β5.6.30ʹΞοϓάϨʔυ͢Δ(Security Release)
    ͜Ε·Ͱ΍͖ͬͯͨࣄ

    View Slide

  5. ࠓ೔͓࿩͍ͨ͠ࣄ

    View Slide

  6. طଘͷ࢓༷ʹ߹Θͤͨ3&45GVM"1*Λ
    ৽نͰ։ൃ͢Δ࿩
    ࠓ೔͓࿩͍ͨ͠ࣄ
    طଘͷ8FCαʔϏεΛ"1*Խͤ͞Δ
    ৽͘͠"1*Λ࡞Δ
    8FC"QQ
    ˞ҎԼ"1*ͱ͍͏දه͸3&45GVM"1*ͱ͠·͢ɻ

    View Slide

  7. എܠ

    View Slide

  8. ͋Δ৽ػೳͷ։ൃͷҝ
    ৽نͰ"1*Λ։ൃ͢Δࣄʹͳͬͨɻ
    എܠ

    View Slide

  9. ࣌ؒ
    ΍Δ΂͖ࣄ
    Ϧιʔεఆٛ
    ΤϯυϙΠϯτఆٛ
    Ϩεϙϯεͷఆٛ
    ΤϯυϙΠϯτͷ࣮૷
    ࣮૷͢Δલ
    എܠ

    View Slide

  10. εςʔλείʔυ͸
    Ͳ͏͢Δͷ͔
    ΤϥʔϨεϙϯε͸
    Կ͕ฦͬͯ͘Δͷ
    ͲΜͳΤϯυϙΠϯ
    τ͕ඞཁͳͷ
    ϦιʔεԿ͕͋Δͷ
    ઃܭஈ֊
    ࣌ؒ
    ΍Δ΂͖ࣄ
    Ϧιʔεఆٛ
    ΤϯυϙΠϯτఆٛ
    Ϩεϙϯεͷఆٛ
    ΤϯυϙΠϯτͷ࣮૷
    എܠ

    View Slide

  11. εςʔλείʔυ͸
    Ͳ͏͢Δͷ͔
    ͲΜͳΤϯυϙΠϯ
    τ͕ඞཁͳͷ
    σΟϨΫτϦߏ੒͸Ͳ͏͢Δͷ
    ςετ͸
    ࣮૷ஈ֊
    طଘͷ%#ʹͲ͏΍ͬͯ߹ΘͤΔͷ
    ϦιʔεԿ͕͋Δͷ
    ΤϥʔϨεϙϯε͸
    Կ͕ฦͬͯ͘Δͷ
    ࣌ؒ
    ΍Δ΂͖ࣄ
    Ϧιʔεఆٛ
    ΤϯυϙΠϯτఆٛ
    Ϩεϙϯεͷఆٛ
    ΤϯυϙΠϯτͷ࣮૷
    എܠ

    View Slide

  12. ։ൃཁ݅
    ɾ%#͸طଘͷ΋ͷΛѻ͏
    ɾಠࣗͷςʔϒϧن໿
    ɾѻ͏%#͕ͭଘࡏ͢Δ
    എܠ
    ɾ3&45GVMͳ"1*Λ৽نͰ։ൃ
    ۀ຿Ͱ։ൃ͸ະܦݧ

    View Slide

  13. "1*։ൃ͸ߟ͑Δࣄ΋ɺ΍Δࣄ΋ଟ͗͢ʜ
    എܠ

    View Slide

  14. ͜ͷΑ͏ͳঢ়گͰ΋
    ཁ݅Λຬͨͯ͠"1*Λ։ൃ͍ͨ͠
    എܠ

    View Slide

  15. എܠ

    View Slide

  16. എܠ
    ͳͥ-BSBWFMͳͷ͔
    ɾυΩϡϝϯτͷ৘ใྔ͕ଟ͍ɻ3FBE%PVCMFΛݟΕ͹ղܾ͢Δɻ
    ࣾ಺Ͱ૬ஊͰ͖Δਓ΋͍Δɻ

    ɾೝূͱೝՄɾϩάͷಋೖ͸ඞਢͰ͋Γɺͦ͜Ͱ᪴͘ͷ͸ࠔΔ
    -BSBWFMʹ͸ඪ४ೝূϥΠϒϥϦͷ1BTTQPSU͕࢖͑Δ

    ɾڧྗͳσʔλϕʔεΫΤϦʔϏϧμʔ͕͋ΔͷͰɺෳࡶͳ
    ςʔϒϧεΩʔϚͰ΋ରॲͰ͖Δɻ

    View Slide

  17. എܠ
    ࣌ؒ
    ΍Δ΂͖ࣄ
    Ϧιʔεఆٛ
    ΤϯυϙΠϯτઃܭ
    Ϩεϙϯεͷઃܭ
    ΤϯυϙΠϯτͷ࣮૷
    ఆٛ
    ࣮૷

    View Slide

  18. ఆٛɾ࣮૷ͷ྆໘͔Β
    طଘ8FCαʔϏεΛ-BSBWFMͰ
    "1*Խ͢Δ͓࿩͠·͢ɻ
    എܠ

    View Slide

  19. ΞδΣϯμ

    View Slide

  20. ΞδΣϯμ
    ɾ4XBHHFSͰ"1*ͷυΩϡϝϯτԽ
    ɾσΟϨΫτϦͷߏ੒Λ੹຿ʹ෼͚ͯΤϯυϙΠϯτΛ࣮૷͢Δɻ
    ɾطଘʹ%#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ5JQT
    ɾ·ͱΊ

    View Slide

  21. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ

    View Slide

  22. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ
    ɾ3&45GVM"1*Λߏங͢ΔͨΊͷΦʔϓϯιʔεͷϑϨʔϜϫʔΫ
    ɾ+40/΋͘͠͸:".-ܗࣜͰهड़͕Ͱ͖Δ
    ɾϩʔΧϧͰϞοΫαʔόΛ্ཱͪ͛Δࣄ΋Մೳ

    View Slide

  23. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ
    4XBHHFS4QFD 4XBHHFS6*

    View Slide

  24. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ
    ͳͥ4XBHHFSΛ࠾༻ͨ͠ͷ͔
    ɾҰ൪ͷཧ༝ͱͯ͠͸ɺΫϥΠΞϯτͱαʔόαΠυͷೝࣝΛ߹ΘͤΔҝ
    ɾ"1*ଆͰఆٛ͢ΔΑΓ΋ΫϥΠΞϯτଆ ࢖͍ਓ
    ͕ఆٛͨ͠ํ͕ྑ͍
    4XBHHFS
    BQJWIPHF
    Λୟ͍ͨΒ
    ˓˓ͳϨεϙϯε
    ͕ཉ͍͠
    ΫϥΠΞϯτଆ
    ɾ:".-͸ڞ௨ͰಡΊΔҝɺ͓ޓ͍ʹมߋ΍मਖ਼͕͠΍͍͢
    αʔόଆ
    ˓˓ͳϨεϙϯε
    ͕ฦͬͯ͘ΔΑ͏
    ʹϨεϙϯεΛ૊
    ΈཱͯΑ͏

    View Slide

  25. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ
    ɾΤϯυϙΠϯτΛ௥Ճ͢Δ౓ʹίʔυ͕ੌ·͘͡ݟͮΒ͘ͳΔ໰୊
    ɾมߋ͠Α͏ʹ΋ɺߦ͙Β͍௒͑ͯ͘Δͱ໨Ͱ௥ͬͯमਖ਼Ͱ͖ͳ͘ͳΔʜ
    ɾ4XBHHFS1)1΍-4XBHHFS΋ߟ͕͑ͨίʔυͷՄಡੑ͕Լ͕Δ
    ͦ΋ͦ΋ΫϥΠΞϯτଆ͕͍͡Εͳ͍

    4XBHHFSͱݴ͑͹ʜ

    View Slide

  26. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ
    JOEFYZNM
    SFGΛ࢓༷ͯ͠EFpOJUJPOTͱQBUITΛ෼ׂͯ͠؅ཧ͢Δ

    View Slide

  27. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ
    $ tree -I node_modules
    .
    ├── definitions
    │ ├──author.yml
    ├── index.yml
    ├── paths
    │ ├── account
    │ │ └── authors.yml
    └── resolve.js
    ɾEFpOJUJPOTσΟϨΫτϦҎԼʹ.PEFMΛఆٛ͢Δ
    ɾQBUITσΟϨΫτϦҎԼͷϑΝΠϧʹΤϯυϙΠϯτͷ࢓༷Λఆٛ͢Δ
    SFGΛ࢓༷ͯ͠EFpOJUJPOTͱQBUITΛ෼ׂͯ͠؅ཧ͢Δ

    View Slide

  28. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ
    SFGΛ࢓༷ͯ͠EFpOJUJPOTͱQBUITΛ෼ׂͯ͠؅ཧ͢Δ
    JOEFYZNM
    BVUIPSTZNM QBUITσΟϨΫτϦ
    BVUIPSZNM EFpOJUJPOTσΟϨΫτϦ

    View Slide

  29. 4XBHHFSΛ࢖ͬͨ"1*ͷυΩϡϝϯτԽ
    ͜ΕΒΛ݁߹ͤͯ͞JOEFYZNMΛ࡞੒͢Δ
    const resolve = require('json-refs').resolveRefs;
    const YAML = require('js-yaml');
    const fs = require('fs');
    const root = YAML.load(fs.readFileSync('index.yml').toString());
    const options = {
    loaderOptions : {
    processContent : function (res, callback) {
    callback(undefined, YAML.safeLoad(res.text));
    }
    }
    };
    resolve(root, options).then(function (results) {
    console.log(YAML.dump(results.resolved));
    });
    node resolve.js > index_all.yml # ϑΝΠϧ໊͸೚ҙ
    SFTPMWFKT
    ৄࡉ4XBHHFS༻ϑΝΠϧΛ෼ׂͯ͠هड़͠Α͏
    ෼ׂ͞ΕͨϑΝΠϧ͕౷߹͞Εͯग़ྗ͞ΕΔ

    View Slide

  30. ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒

    View Slide

  31. 3PVUFS
    ᶃ(&5BQJWIPHF
    .JEEMFXBSF 3FRVFTU
    $POUSPMMFS
    3FTQPOTF .PEFM
    ᶄೝূ ᶅόϦσʔγϣϯ

    %#ૢ࡞
    ϨεϙϯεΛ࡞੒
    ϨεϙϯεΛฦ͢
    ɾͭͷΤϯυϙΠϯτʹରͯ͠ɺͭͷ$POUSPMMFSͰରԠΛߦ͏
    ɾ(&5BQJWIPHF
    )PHF$POUSPMMFS
    ˞ఏڙ͢ΔαʔϏεͷ؀ڥʹΑͬͯมΘΔҝɺ͋͘·ͰͭͷྫͰ͢ʂ
    ɾ1045BQJWIPHF
    ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
    #FGPSF

    View Slide

  32. ├── app
    ├── Http
    │ ├── Controllers
    │ │ └── HogeController.php
    └── Requests
    │ └── HogeRequest.php
    └── Hoge.php
    ├── routes
    ├── api.php
    ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒

    View Slide

  33. SPVUFTBQJQIQ
    BQQ)UUQ)PHF$POUSPMMFSQIQ
    ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
    Route::prefix('api/v1')->group(function () {
    Route::get('/hoges', '[email protected]');
    Route::get(‘/hoges/1', '[email protected]');
    Route::post(‘/hoges', '[email protected]');
    Route::put(‘/hoges/1', '[email protected]');
    Route::delete(‘/hoges/1', '[email protected]');
    });

    View Slide

  34. 3PVUFS
    ᶃ(&5IPHF
    .JEEMFXBSF 3FRVFTU
    $POUSPMMFS
    3FTQPOTF .PEFM
    ᶄೝূ ᶅόϦσʔγϣϯ

    %#ૢ࡞
    ϨεϙϯεΛ࡞੒
    ϨεϙϯεΛฦ͢
    ɾஈʑͱ$POUSPMMFS͕ංେԽͯ͘͠Δͷ͕ݟ͑ͯ͘Δʜ
    ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒

    View Slide

  35. ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
    Ͳ͏ͨ͠΋ͷ͔ʜ

    View Slide

  36. 3PVUFS
    ᶃ(&5BQJWIPHF
    .JEEMFXBSF 3FRVFTU
    $POUSPMMFS
    3FTQPOTF
    .PEFM
    ᶄೝূ ᶅόϦσʔγϣϯ

    ϨεϙϯεΛฦ͢
    4FSWJDF
    ɾϏδωεϩδοΫΛ"QQ4FSWJDF΁੾Γग़͢
    ɾ(&5BQJWIPHF )PHF$POUSPMMFS!JOEFY

    %#ૢ࡞
    ϨεϙϯεΛ࡞੒
    ɾ$POUSPMMFSʹ͸ϏδωεϩδοΫΛॻ͔ͣʹ)551ͷؔ৺ࣄʹूதͤ͞Δɻ
    ɾϧʔςΟϯάαʔϏεΫϥε
    -JTU4FSWJDFQIQ
    ɾ1045BQJWIPHF )PHF$POUSPMMFS!TUPSF $SFBUF4FSWJDFQIQ
    ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
    "GUFS

    View Slide

  37. ├── app
    ├── Http
    │ ├── Controllers
    │ │ └── HogeController.php
    └── Requests
    │ └── HogeRequest.php
    └── Hoge.php
    ├── Servicies
    └── Hoge
    │ └── ListService.php #GET Ұཡ
    │ └── ShowService.php #GET ৄࡉ
    │ └── CreateService.php #POST
    │ └── DeleteService.php #DELET
    ├── routes
    ├── api.php
    ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒

    View Slide

  38. BQQ4FSWJDFT)PHF-JTU4FSWJDFQIQ
    ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
    ɾ"QQ4FSWJDFͰΤϯυϙΠϯτΛୟ͍ͨࡍͷϏδωεϩδοΫͷॲཧΛ٧ΊΔ

    View Slide

  39. ੹຿Λ෼͚ͨσΟϨΫτϦߏ੒
    ɾ$POUSPMMFSͰ͸͋͘·ͰϨεϙϯεΛKTPOͰฦ͚ͩ͢ʹప͢Δ

    View Slide

  40. %#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

    View Slide

  41. wѻ͏%#͕ෳ਺ଘࡏ͢Δɻ
    w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ
    λ͔Βडऔͬͨ஋Λࣗಈతʹม׵͢Δɻ
    %#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

    View Slide

  42. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹
    FOWͰઃఆΛ௥Ճ͢Δ
    # 1ͭΊͷDB
    DB_CONNECTION=mysql1
    DB_HOST=database
    DB_PORT=3306
    DB_DATABASE=database_1
    DB_USERNAME=hoge
    DB_PASSWORD=secret
    # 2ͭΊͷDB
    DB_CONNECTION_2=mysql2
    DB_HOST_2=database
    DB_PORT_2=3306
    DB_DATABASE_2=database_2
    DB_USERNAME_2=fuga
    DB_PASSWORD_2=secret
    FOW

    View Slide

  43. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    DPOpHaEBUBCBTFQIQʹઃఆΛ௥Ճ͢Δ
    # 2ͭΊͷDBͷઃఆΛ௥Ճ͢Δ
    'mysql2' => [
    'driver' => 'mysql',
    'host' => env(‘DB_HOST_2‘, '127.0.0.1'),
    'port' => env(‘DB_ACC_PORT_2', '3306'),
    'database' => env(‘DB_DATABASE_2', 'forge'),
    'username' => env(‘DB_USERNAME_2', 'forge'),
    'password' => env(‘DB_PASSWORD_2', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_general_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
    ],
    DPOpHaEBUBCBTFQIQ
    ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹

    View Slide

  44. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    $date = DB::connection(env(‘DB_CONNECTION_2’))
    ->table(’t_name’)
    ->get()
    NZTRMͷઃఆͰ%#ʹ઀ଓͨ͠ঢ়ଶͰσʔλΛऔಘ͢Δࣄ͕ՄೳͱͳΔ
    FOW
    ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹

    View Slide

  45. ˞FOW
    Λݺͼग़͢ࡍͷ஫ҙ
    %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

    View Slide

  46. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹
    ৄࡉ:Laravelͷ .env ͷ஋͸config()ܦ༝Ͱ࢖͏ɻ
    class HogeController extends Controller
    {
    public function getHoge()
    {
    dd(
    env('MY_ENV'),
    config('my-app.my-env')
    );
    }
    }
    ˞։ൃ؀ڥͰ͸ྑ͍͕DPOpHDBDIFͨ͠ঢ়ଶͰͷຊ൪؀ڥʹ͓͍ͯFOW
    ͕஋Λฦ͞ͳ͍ɻ

    View Slide

  47. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    ˞։ൃ؀ڥͰ͸ྑ͍͕DPOpHDBDIFͨ͠ঢ়ଶͰͷຊ൪؀ڥʹ͓͍ͯFOW
    ͕஋Λฦ͞ͳ͍ɻ
    ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹
    ৄࡉ:Laravelͷ .env ͷ஋͸config()ܦ༝Ͱ࢖͏ɻ
    null
    "Full"
    php artisan config:cache
    FOW
    Ͱݺͼग़͢ͱOVMM͕ฦͬͯ͘Δɻ

    View Slide

  48. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    DPOpH
    Λ࢖ͬͯݺͼग़͢Α͏ʹ͢Δ
    ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹
    Psy Shell v0.9.8 (PHP 7.2.1 — cli) by Justin Hileman
    >>> dump(config('database.connections.mysql2'))
    array:12 [
    "driver" => "mysql"
    "host" => "database"
    "port" => "3306"
    "database" => "database_2"
    "username" => "fuga"
    "password" => "secret"
    "unix_socket" => ""
    "charset" => "utf8"
    "collation" => "utf8_general_ci"
    "prefix" => ""
    "strict" => true
    "engine" => null
    ]

    View Slide

  49. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    DPOpH
    Λ࢖ͬͯݺͼग़͢Α͏ʹ͢Δ
    ѻ͏%#͕ෳ਺ଘࡏ͢Δ৔߹
    $date = DB::connection(config(‘database.connections.mysql2’))
    ->table(’t_name’)
    ->get()

    View Slide

  50. wѻ͏%#͕ෳ਺ଘࡏ͢Δɻ
    w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ
    λ͔Βडऔͬͨ஋Λࣗಈతʹม׵͢Δɻ
    %#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

    View Slide

  51. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    +------------------------+--------------+------+-----+-------------------+-----------------------------+
    | Field | Type | Null | Key | Default | Extra |
    +------------------------+--------------+------+-----+-------------------+-----------------------------+
    | user_id | int(20) | NO | PRI | NULL | auto_increment |
    | name | varchar(32) | YES | MUL | NULL | |
    | email | varchar(255) | YES | MUL | NULL | |
    | state | tinyint(4) | YES | MUL | NULL | |
    | make_date | datetime | YES | MUL | NULL | |
    | update_date | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
    +------------------+--------------+------+-----+-------------------+-----------------------------------+
    [email protected]ςʔϒϧ
    TUBUF༗ޮ TUBUFແޮ
    (&5BQJVTST TUBUFFOBCMFE
    (&5BQJVTST TUBUFEJTBCMFE
    TUBUFFOBCMFE͸ͳ͍Αʂ
    (&5BQJVTST TUBUFBMM
    "1* ΫϥΠΞϯτ

    View Slide

  52. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    ΞΫηαΛ࢖ͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ
    ৄࡉ-BSBWFM&MPRVFOUɿϛϡʔςλ

    View Slide

  53. ΞΫηαΛ࢖ͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ
    %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    (&5BQJVTST TUBUFFOBCMFE
    TUBUFFOBCMFE ΫϥΠΞϯτ
    "1*
    TUBUF
    %#
    ࠓճͷέʔεͰ͸TUBUFΛม׵͍ͨ͠ͷͰΞΫηαΛ࡞Δ
    HFU4UBUF"UUSJCVUF
    $user = App\User::all();
    # state=1ͷuserΛऔಘ͢ΔΑ͏ʹࣗಈͰม׵͢Δ

    $firstName = $user->state(’enabled’)->get()

    View Slide

  54. %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    ΞΫηαΛ࢖ͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ

    View Slide

  55. $users = User::where('user_id', $this->request->userId)
    ->state(User::toStateKey($state))
    ->limit($limit)
    ->offset($offset)
    ->get();
    %#࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ
    ΞΫηαɾϛϡʔςʔλΛ࢖͏ࣄͰΫΤϦʔύϥϝʔλͰडऔͬͨ஋Λ
    ࣗಈͰ&MPRVFOͰ࢖͑ΔΑ͏ʹͯ͠σʔλΛऔಘ͢Δࣄ͕Ͱ͖Δɻ
    TUBUFFOBCMFE͕ૹΒΕͯ͘ΔͱTUBUFʹม׵͞ΕΔ
    TUBUFEJTBCMFE͕ૹΒΕͯ͘ΔͱTUBUFʹม׵͞ΕΔ
    TUBUFBMM͕ૹΒΕͯ͘ΔͱɺԿ΋͠ͳ͍ͷͰࣗಈͰ
    TUBUFPSTUBUFͷσʔλΛऔಘ͢Δɻ
    ΞΫηαΛ࢖ͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ

    View Slide

  56. wѻ͏%#͕ෳ਺ଘࡏ͢Δɻ
    w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ
    λ͔Βडऔͬͨ஋Λࣗಈతʹม׵͢Δɻ
    %#ͷ࢓༷ʹ߹Θͤͯ-BSBWFMଆͰௐ੔͢Δ

    View Slide

  57. ·ͱΊ

    View Slide

  58. ·ͱΊ
    ɾ3&45GVM"1*Λ͔Β࡞੒͢Δͷ͸େมͳͷͰɺ·ͣ͸
    ΫϥΠΞϯτଆͱ૬ஊ͠ͳ͕ΒϨεϙϯεΛ͔ͬ͠Γઃܭ͢Δɻ
    ɾطଘͷ%#ͷ࢓༷ʹରͯ͠΋-BSBWFMͳΒɺඋΘͬͯΔػೳΛ࢖͍͜ͳ͢
    ɹ͚ͩͰ͋Δఔ౓ͷࣄ͸Ͱ͖Δɻ
    ɾͪΐͬͱ೉͍͠ࣄΛ΍Δ৔߹͸੹຿ΛΘ͚ΔΑ͏ʹ͢Δɻ

    View Slide

  59. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ
    ϓϩϑΟʔϧGFOEP1SPpMF

    View Slide