Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Laravelを使った既存WebサービスのAPI化
Futoshi Endo
September 13, 2018
Programming
2
2.4k
Laravelを使った既存WebサービスのAPI化
Laravel MeetUpTokyo #11で発表した内容になります。
https://laravel-meetup-tokyo.connpass.com/event/93838/
Futoshi Endo
September 13, 2018
Tweet
Share
More Decks by Futoshi Endo
See All by Futoshi Endo
fendo181
0
2.3k
fendo181
0
340
fendo181
6
3.7k
fendo181
1
1.8k
fendo181
1
610
fendo181
0
680
Other Decks in Programming
See All in Programming
muttsu_623
0
550
akatsukinewgrad
0
220
hirotokirimaru
1
440
yumcyawiz
5
670
mfunaki
1
430
line_developers_tw
1
500
dictoss
0
170
ajstarks
2
550
akatsukinewgrad
0
220
nbkouhou
9
4.8k
shigeruoda
0
490
line_developers_tw2
0
1k
Featured
See All Featured
cassininazir
347
20k
smashingmag
283
47k
caitiem20
308
17k
bermonpainter
342
26k
chrislema
231
16k
danielanewman
1
480
kastner
54
1.9k
iamctodd
17
1.9k
jponch
103
5k
revolveconf
200
9.6k
chriscoyier
499
130k
sferik
610
54k
Transcript
ԕ౻ଠಙ(.01FQBCP *OD -BSBWFM.FFU6Q5PLZP -BSBWFMΛͬͨ طଘ8FCαʔϏεͷ"1*Խ
ԕ౻ଠಙ ͑ΜͲ͎ʔ !'FOEP 4)ࣄۀ෦(PPQFάϧʔϓ8FCΤϯδχΞ @Fendo181 @Fendo181
ɾ؆୯ʹࣗͷϗʔϜϖʔδ͕࡞Ͱ͖Δ ɾࠓͰαʔϏεՔಇͯ͠
-VNFOͰݎ࿚ͳ"1*Λઃܭ͢Δɻ ʲ༁ʳLaravelΛ5.6͔Β5.6.30ʹΞοϓάϨʔυ͢Δ(Security Release) ͜Ε·Ͱ͖ͬͯͨࣄ
ࠓ͓͍ͨ͠ࣄ
طଘͷ༷ʹ߹Θͤͨ3&45GVM"1*Λ ৽نͰ։ൃ͢Δ ࠓ͓͍ͨ͠ࣄ طଘͷ8FCαʔϏεΛ"1*Խͤ͞Δ ৽͘͠"1*Λ࡞Δ 8FC"QQ ˞ҎԼ"1*ͱ͍͏දه3&45GVM"1*ͱ͠·͢ɻ
എܠ
͋Δ৽ػೳͷ։ൃͷҝ ৽نͰ"1*Λ։ൃ͢Δࣄʹͳͬͨɻ എܠ
࣌ؒ Δ͖ࣄ Ϧιʔεఆٛ ΤϯυϙΠϯτఆٛ Ϩεϙϯεͷఆٛ ΤϯυϙΠϯτͷ࣮ ࣮͢Δલ എܠ
εςʔλείʔυ Ͳ͏͢Δͷ͔ ΤϥʔϨεϙϯε Կ͕ฦͬͯ͘Δͷ ͲΜͳΤϯυϙΠϯ τ͕ඞཁͳͷ ϦιʔεԿ͕͋Δͷ ઃܭஈ֊ ࣌ؒ Δ͖ࣄ
Ϧιʔεఆٛ ΤϯυϙΠϯτఆٛ Ϩεϙϯεͷఆٛ ΤϯυϙΠϯτͷ࣮ എܠ
εςʔλείʔυ Ͳ͏͢Δͷ͔ ͲΜͳΤϯυϙΠϯ τ͕ඞཁͳͷ σΟϨΫτϦߏͲ͏͢Δͷ ςετ ࣮ஈ֊ طଘͷ%#ʹͲ͏ͬͯ߹ΘͤΔͷ ϦιʔεԿ͕͋Δͷ ΤϥʔϨεϙϯε
Կ͕ฦͬͯ͘Δͷ ࣌ؒ Δ͖ࣄ Ϧιʔεఆٛ ΤϯυϙΠϯτఆٛ Ϩεϙϯεͷఆٛ ΤϯυϙΠϯτͷ࣮ എܠ
։ൃཁ݅ ɾ%#طଘͷͷΛѻ͏ ɾಠࣗͷςʔϒϧن ɾѻ͏%#͕ͭଘࡏ͢Δ എܠ ɾ3&45GVMͳ"1*Λ৽نͰ։ൃ ۀͰ։ൃະܦݧ
"1*։ൃߟ͑ΔࣄɺΔࣄଟ͗͢ʜ എܠ
͜ͷΑ͏ͳঢ়گͰ ཁ݅Λຬͨͯ͠"1*Λ։ൃ͍ͨ͠ എܠ
എܠ
എܠ ͳͥ-BSBWFMͳͷ͔ ɾυΩϡϝϯτͷใྔ͕ଟ͍ɻ3FBE%PVCMFΛݟΕղܾ͢Δɻ ࣾͰ૬ஊͰ͖Δਓ͍Δɻ ɾೝূͱೝՄɾϩάͷಋೖඞਢͰ͋Γɺͦ͜Ͱ᪴͘ͷࠔΔ -BSBWFMʹඪ४ೝূϥΠϒϥϦͷ1BTTQPSU͕͑Δ ɾڧྗͳσʔλϕʔεΫΤϦʔϏϧμʔ͕͋ΔͷͰɺෳࡶͳ ςʔϒϧεΩʔϚͰରॲͰ͖Δɻ
എܠ ࣌ؒ Δ͖ࣄ Ϧιʔεఆٛ ΤϯυϙΠϯτઃܭ Ϩεϙϯεͷઃܭ ΤϯυϙΠϯτͷ࣮ ఆٛ ࣮
ఆٛɾ࣮ͷ྆໘͔Β طଘ8FCαʔϏεΛ-BSBWFMͰ "1*Խ͢Δ͓͠·͢ɻ എܠ
ΞδΣϯμ
ΞδΣϯμ ɾ4XBHHFSͰ"1*ͷυΩϡϝϯτԽ ɾσΟϨΫτϦͷߏΛʹ͚ͯΤϯυϙΠϯτΛ࣮͢Δɻ ɾطଘʹ%#ͷ༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ5JQT ɾ·ͱΊ
4XBHHFSΛͬͨ"1*ͷυΩϡϝϯτԽ
4XBHHFSΛͬͨ"1*ͷυΩϡϝϯτԽ ɾ3&45GVM"1*Λߏங͢ΔͨΊͷΦʔϓϯιʔεͷϑϨʔϜϫʔΫ ɾ+40/͘͠:".-ܗࣜͰهड़͕Ͱ͖Δ ɾϩʔΧϧͰϞοΫαʔόΛ্ཱͪ͛ΔࣄՄೳ
4XBHHFSΛͬͨ"1*ͷυΩϡϝϯτԽ 4XBHHFS4QFD 4XBHHFS6*
4XBHHFSΛͬͨ"1*ͷυΩϡϝϯτԽ ͳͥ4XBHHFSΛ࠾༻ͨ͠ͷ͔ ɾҰ൪ͷཧ༝ͱͯ͠ɺΫϥΠΞϯτͱαʔόαΠυͷೝࣝΛ߹ΘͤΔҝ ɾ"1*ଆͰఆٛ͢ΔΑΓΫϥΠΞϯτଆ ͍ਓ ͕ఆٛͨ͠ํ͕ྑ͍ 4XBHHFS BQJWIPHF Λୟ͍ͨΒ ˓˓ͳϨεϙϯε
͕ཉ͍͠ ΫϥΠΞϯτଆ ɾ:".-ڞ௨ͰಡΊΔҝɺ͓ޓ͍ʹมߋमਖ਼͕͍͢͠ αʔόଆ ˓˓ͳϨεϙϯε ͕ฦͬͯ͘ΔΑ͏ ʹϨεϙϯεΛ ΈཱͯΑ͏
4XBHHFSΛͬͨ"1*ͷυΩϡϝϯτԽ ɾΤϯυϙΠϯτΛՃ͢Δʹίʔυ͕ੌ·͘͡ݟͮΒ͘ͳΔ ɾมߋ͠Α͏ʹɺߦ͙Β͍͑ͯ͘ΔͱͰͬͯमਖ਼Ͱ͖ͳ͘ͳΔʜ ɾ4XBHHFS1)1-4XBHHFSߟ͕͑ͨίʔυͷՄಡੑ͕Լ͕Δ ͦͦΫϥΠΞϯτଆ͕͍͡Εͳ͍ 4XBHHFSͱݴ͑ʜ
4XBHHFSΛͬͨ"1*ͷυΩϡϝϯτԽ JOEFYZNM SFGΛ༷ͯ͠EFpOJUJPOTͱQBUITΛׂͯ͠ཧ͢Δ
4XBHHFSΛͬͨ"1*ͷυΩϡϝϯτԽ $ tree -I node_modules . ├── definitions │ ├──author.yml
├── index.yml ├── paths │ ├── account │ │ └── authors.yml └── resolve.js ɾEFpOJUJPOTσΟϨΫτϦҎԼʹ.PEFMΛఆٛ͢Δ ɾQBUITσΟϨΫτϦҎԼͷϑΝΠϧʹΤϯυϙΠϯτͷ༷Λఆٛ͢Δ SFGΛ༷ͯ͠EFpOJUJPOTͱQBUITΛׂͯ͠ཧ͢Δ
4XBHHFSΛͬͨ"1*ͷυΩϡϝϯτԽ SFGΛ༷ͯ͠EFpOJUJPOTͱQBUITΛׂͯ͠ཧ͢Δ JOEFYZNM BVUIPSTZNM QBUITσΟϨΫτϦ BVUIPSZNM EFpOJUJPOTσΟϨΫτϦ
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༻ϑΝΠϧΛׂͯ͠هड़͠Α͏ ׂ͞ΕͨϑΝΠϧ͕౷߹͞Εͯग़ྗ͞ΕΔ
Λ͚ͨσΟϨΫτϦߏ
3PVUFS ᶃ(&5BQJWIPHF .JEEMFXBSF 3FRVFTU $POUSPMMFS 3FTQPOTF .PEFM ᶄೝূ ᶅόϦσʔγϣϯ ᶆ
%#ૢ࡞ ϨεϙϯεΛ࡞ ϨεϙϯεΛฦ͢ ɾͭͷΤϯυϙΠϯτʹରͯ͠ɺͭͷ$POUSPMMFSͰରԠΛߦ͏ ɾ(&5BQJWIPHF )PHF$POUSPMMFS ˞ఏڙ͢ΔαʔϏεͷڥʹΑͬͯมΘΔҝɺ͋͘·ͰͭͷྫͰ͢ʂ ɾ1045BQJWIPHF Λ͚ͨσΟϨΫτϦߏ #FGPSF
├── app ├── Http │ ├── Controllers │ │ └──
HogeController.php └── Requests │ └── HogeRequest.php └── Hoge.php ├── routes ├── api.php Λ͚ͨσΟϨΫτϦߏ
SPVUFTBQJQIQ BQQ)UUQ)PHF$POUSPMMFSQIQ Λ͚ͨσΟϨΫτϦߏ Route::prefix('api/v1')->group(function () { Route::get('/hoges', 'Hoge@index'); Route::get(‘/hoges/1', 'Hoge@show');
Route::post(‘/hoges', 'Hoge@store'); Route::put(‘/hoges/1', 'Hoge@update'); Route::delete(‘/hoges/1', 'Hoge@delete'); });
3PVUFS ᶃ(&5IPHF .JEEMFXBSF 3FRVFTU $POUSPMMFS 3FTQPOTF .PEFM ᶄೝূ ᶅόϦσʔγϣϯ ᶆ
%#ૢ࡞ ϨεϙϯεΛ࡞ ϨεϙϯεΛฦ͢ ɾஈʑͱ$POUSPMMFS͕ංେԽͯ͘͠Δͷ͕ݟ͑ͯ͘Δʜ Λ͚ͨσΟϨΫτϦߏ
Λ͚ͨσΟϨΫτϦߏ Ͳ͏ͨ͠ͷ͔ʜ
3PVUFS ᶃ(&5BQJWIPHF .JEEMFXBSF 3FRVFTU $POUSPMMFS 3FTQPOTF .PEFM ᶄೝূ ᶅόϦσʔγϣϯ ᶇ
ϨεϙϯεΛฦ͢ 4FSWJDF ɾϏδωεϩδοΫΛ"QQ4FSWJDFΓग़͢ ɾ(&5BQJWIPHF )PHF$POUSPMMFS!JOEFY ᶆ %#ૢ࡞ ϨεϙϯεΛ࡞ ɾ$POUSPMMFSʹϏδωεϩδοΫΛॻ͔ͣʹ)551ͷؔ৺ࣄʹूதͤ͞Δɻ ɾϧʔςΟϯάαʔϏεΫϥε -JTU4FSWJDFQIQ ɾ1045BQJWIPHF )PHF$POUSPMMFS!TUPSF $SFBUF4FSWJDFQIQ Λ͚ͨσΟϨΫτϦߏ "GUFS
├── 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 Λ͚ͨσΟϨΫτϦߏ
BQQ4FSWJDFT)PHF-JTU4FSWJDFQIQ Λ͚ͨσΟϨΫτϦߏ ɾ"QQ4FSWJDFͰΤϯυϙΠϯτΛୟ͍ͨࡍͷϏδωεϩδοΫͷॲཧΛ٧ΊΔ
Λ͚ͨσΟϨΫτϦߏ ɾ$POUSPMMFSͰ͋͘·ͰϨεϙϯεΛKTPOͰฦ͚ͩ͢ʹప͢Δ
%#ͷ༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ
wѻ͏%#͕ෳଘࡏ͢Δɻ w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ λ͔ΒडऔͬͨΛࣗಈతʹม͢Δɻ %#ͷ༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ
%#༷ʹ߹Θͤͯ-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
%#༷ʹ߹Θͤͯ-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 ѻ͏%#͕ෳଘࡏ͢Δ߹
%#༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ $date = DB::connection(env(‘DB_CONNECTION_2’)) ->table(’t_name’) ->get() NZTRMͷઃఆͰ%#ʹଓͨ͠ঢ়ଶͰσʔλΛऔಘ͢Δࣄ͕ՄೳͱͳΔ FOW ѻ͏%#͕ෳଘࡏ͢Δ߹
˞FOW Λݺͼग़͢ࡍͷҙ %#༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ
%#༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ ѻ͏%#͕ෳଘࡏ͢Δ߹ ৄࡉ:Laravelͷ .env ͷconfig()ܦ༝Ͱ͏ɻ <?php class HogeController extends Controller
{ public function getHoge() { dd( env('MY_ENV'), config('my-app.my-env') ); } } ˞։ൃڥͰྑ͍͕DPOpHDBDIFͨ͠ঢ়ଶͰͷຊ൪ڥʹ͓͍ͯFOW ͕Λฦ͞ͳ͍ɻ
%#༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ ˞։ൃڥͰྑ͍͕DPOpHDBDIFͨ͠ঢ়ଶͰͷຊ൪ڥʹ͓͍ͯFOW ͕Λฦ͞ͳ͍ɻ ѻ͏%#͕ෳଘࡏ͢Δ߹ ৄࡉ:Laravelͷ .env ͷconfig()ܦ༝Ͱ͏ɻ null "Full" php
artisan config:cache FOW Ͱݺͼग़͢ͱOVMM͕ฦͬͯ͘Δɻ
%#༷ʹ߹Θͤͯ-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 ]
%#༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ DPOpH Λͬͯݺͼग़͢Α͏ʹ͢Δ ѻ͏%#͕ෳଘࡏ͢Δ߹ $date = DB::connection(config(‘database.connections.mysql2’)) ->table(’t_name’) ->get()
wѻ͏%#͕ෳଘࡏ͢Δɻ w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ λ͔ΒडऔͬͨΛࣗಈతʹม͢Δɻ %#ͷ༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ
%#༷ʹ߹Θͤͯ-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 | +------------------+--------------+------+-----+-------------------+-----------------------------------+ U@VTFSςʔϒϧ TUBUF༗ޮ TUBUFແޮ (&5BQJVTST TUBUFFOBCMFE (&5BQJVTST TUBUFEJTBCMFE TUBUFFOBCMFEͳ͍Αʂ (&5BQJVTST TUBUFBMM "1* ΫϥΠΞϯτ
%#༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ ΞΫηαΛͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ ৄࡉ-BSBWFM&MPRVFOUɿϛϡʔςλ
ΞΫηαΛͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ %#༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ (&5BQJVTST TUBUFFOBCMFE TUBUFFOBCMFE ΫϥΠΞϯτ "1* TUBUF %# ࠓճͷέʔεͰTUBUFΛม͍ͨ͠ͷͰΞΫηαΛ࡞Δ
HFU4UBUF"UUSJCVUF $user = App\User::all(); # state=1ͷuserΛऔಘ͢ΔΑ͏ʹࣗಈͰม͢Δ $firstName = $user->state(’enabled’)->get()
%#༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ ΞΫηαΛͬͯ&MPRVFOUͰѻ͑Δܗʹ͢Δɻ
$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Ͱѻ͑Δܗʹ͢Δɻ
wѻ͏%#͕ෳଘࡏ͢Δɻ w&MPRVFOUͰΞΫηαΛఆٛͯ͠ΫΤϦʔύϥϝʔ λ͔ΒडऔͬͨΛࣗಈతʹม͢Δɻ %#ͷ༷ʹ߹Θͤͯ-BSBWFMଆͰௐ͢Δ
·ͱΊ
·ͱΊ ɾ3&45GVM"1*Λ͔Β࡞͢ΔͷେมͳͷͰɺ·ͣ ΫϥΠΞϯτଆͱ૬ஊ͠ͳ͕ΒϨεϙϯεΛ͔ͬ͠Γઃܭ͢Δɻ ɾطଘͷ%#ͷ༷ʹରͯ͠-BSBWFMͳΒɺඋΘͬͯΔػೳΛ͍͜ͳ͢ ɹ͚ͩͰ͋ΔఔͷࣄͰ͖Δɻ ɾͪΐͬͱ͍͠ࣄΛΔ߹ΛΘ͚ΔΑ͏ʹ͢Δɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ ϓϩϑΟʔϧGFOEP1SPpMF