Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The story that a non-engeneer create PHP site a...
Search
lukamenda26
December 12, 2019
Technology
0
220
The story that a non-engeneer create PHP site and laravel site.
This is a document showed at "OTWEB" event on 12/12/2019.
lukamenda26
December 12, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
ディメンショナルモデリングを支えるData Vaultについて
10xinc
1
110
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
240
GitHub Copilotを使いこなす 実例に学ぶAIコーディング活用術
74th
3
3.4k
Amazon Quick Suite で始める手軽な AI エージェント
shimy
0
190
Strands AgentsとNova 2 SonicでS2Sを実践してみた
yama3133
0
190
業務のトイルをバスターせよ 〜AI時代の生存戦略〜
staka121
PRO
2
220
2025-12-18_AI駆動開発推進プロジェクト運営について / AIDD-Promotion project management
yayoi_dd
0
110
Oracle Cloud Infrastructure IaaS 新機能アップデート 2025/09 - 2025/11
oracle4engineer
PRO
0
160
CARTAのAI CoE が挑む「事業を進化させる AI エンジニアリング」 / carta ai coe evolution business ai engineering
carta_engineering
0
1.9k
AIプラットフォームにおけるMLflowの利用について
lycorptech_jp
PRO
1
170
S3を正しく理解するための内部構造の読解
nrinetcom
PRO
2
160
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
390
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Designing for humans not robots
tammielis
254
26k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Context Engineering - Making Every Token Count
addyosmani
9
530
Why Our Code Smells
bkeepers
PRO
340
57k
The Language of Interfaces
destraynor
162
25k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Embracing the Ebb and Flow
colly
88
4.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Transcript
ඇΤϯδχΞ*1 ͕̍ϲ݄ͰPHPͱ LARAVELͷCRUD*2 αΠτΛ࡞Δ·Ͱ 2019/12/12()ɹදࢀಓWebษڧձ Ruka Menda ը૾ެࣜαΠτ͔Βഈआ͍ͯ͠·͢ɻ
༻ޠͷઆ໌ 1. ඇΤϯδχΞɾɾɾITܥͷձࣾʢͱ͍͏͔ɺ͠Webܥձ ͚ࣾͩʁ͘͠ࢲͷલͷ৬͚ͩʁʁʣʹ͓͚ΔɺΤϯδ χΞҎ֎ͷ৬छͷਓʢӦۀetc.ʣͷਓͷ͜ͱɻ࣌ʹ൴Β͕ࣗ ͷ͜ͱΛࣗẍؾຯʹʮඇΤϯδχΞʯͱࣗশ͢Δ͜ͱɻ 2. CRUDɾɾɾΫϥουͱಡΉɻͦΕͧΕCreate, Read, Update,
DeleteΛҙຯ͠ɺ͜ΕΒΛ࣮ͨ͠αΠτʹϒϥβ͔Βͷ ಈ࡞ʹΑΓɺσʔλϕʔεʹରͯ͜͠ͷ̐ͭͷใૢ࡞શͯ ͕࣮ߦՄೳͰ͋ΔαΠτͷ͜ͱΛࢦ͢ʢৄࡉޙड़ʣɻ
ൃදऀʹ͍ͭͯ -ܦྺ • ւಓग़ • 2015ଔʢେଔʣˠ৽ଔͰҩྍػثϝʔΧʔब৬ʢӦۀʣ • 2017ɿւ֎ϘϥϯςΟΞ • 2018ɿWebܥͷձࣾPೖࣾʢӦۀʣ
• 201911݄͡Ίɿͱ͋Δ͖͔͚ͬͰʮϓϩάϥϛϯάͷษڧΛຊؾͰΖ͏ɺΩϟϦΞνΣϯδ͠Α ͏ʂʯͱࢥཱ͍ͪɺPHPͷษڧΛ࢝ΊΔɻ • ಉ݄த०ɿPࣾΛٳ৬ɻ͜ͷ͜Ζʹܝࣔ൘αΠτͷʢCRUDػೳ͋ΓɻPHP ϑϨʔϜϫʔΫͳ͠ʣ • ಉ݄Լ०ɿPࣾΛਖ਼ࣜʹୀ৬ɻ͜ͷ͜ΖʹޱίϛαΠτͷʢCRUDͷ͏ͪCR + ϩάΠϯػೳ PHP ϑϨʔϜϫʔΫLaravel)
ຊLTͷత • స৬׆ಈ • ̍͜͜ϲ݄ͷϓϩάϥϛϯάֶशͷՌใࠂ • αʔόʔαΠυϓϩάϥϛϯάॳֶऀ͕͑ ͓͖ͯ͘ʢʁʣࣝͷհɹ˞ΞϖϯσΟ Ϋεʹͯ
Ռ1 -ܝࣔ൘ • αΠτ໊ɿܝࣔ൘ • ίϯηϓτɿCRUDػೳΛཏͨ͠ܝࣔ൘ • ػೳɿߘ(Create)ɺಡࠐ(Read)ɺฤू (Update)ɺআ(Delete) •
URL: https://maysite.herokuapp.com/index.php • ιʔείʔυ: https://gitlab.com/ruka04/bbc/tree/ div14 • ༻ݴޠ/ϑϨʔϜϫʔΫ: PHP / (ͳ͠) • Webαʔό: Apache • σʔλϕʔε(RDBMS): MySQL
Ռ2 -ޱίϛαΠτ • αΠτ໊ɿྉཧຊ͓͢͢ΊαΠτɹMyϨγϐϒοΫ • ίϯηϓτɿྉཧܥͷຊͷޱίϛ×ʮ࡞ͬͨΑʯίϝϯ τʢʹΫο˓ύοτͷͭ͘ΕΆɺ͘͠ΠϯελͰͷ ྉཧࣗຫతͳߘͱಉٛʣ • ػೳɿߘ(Create)ɺಡࠐ(Read)ɺϩάΠϯೝূ
• URL: https://lit-springs-31811.herokuapp.com/home • ιʔείʔυ: https://github.com/lukamenda26/MyRecipeBooks • ༻ݴޠ/ϑϨʔϜϫʔΫ: PHP / Laravel5.5, JavaScript / Vue.js • Webαʔό: Nginx ˎެ։αΠτApache • σʔλϕʔε(RDBMS): MySQL • ͦͷଞɿ։ൃڥʹDocker (Laradock)ΛɺϞδϡʔϧཧ ʹLaravel MixΛ༻
Ռͷ࡞Λ௨ֶͯ͡Μͩ ͜ͱɾۤ࿑ͨ͜͠ͱ • PHPͷؔ • Ϋϥεͷར༻ʢΫϥε࡞ɺΠϯελϯε࡞ɺϝ ιουͷར༻ɺܧঝʣ • CRUDɹ*2 •
PDOͷར༻ɹ*3 • MySQLͷར༻ɺίϚϯυ͔ΒͷRDBMૢ࡞ɺσʔλ ϕʔεͷ֓೦ཧղɹ*4 • σʔλϕʔεઃܭʢERਤͷ࡞ʣ • Heroku (https://dashboard.heroku.com)Λར༻ͨ͠α Πτެ։ํ๏ɹ*5 • Laravel ϑϨʔϜϫʔΫͷར༻ํ๏ • DockerΛར༻ͨ͠։ൃڥͷߏஙํ๏ • MVCϞσϧͷཧղɹ*6 • ը૾ͷૠೖʢ͑ɺfile()ؔͬͯɺग़ྗ݁Ռྻͳ ͷɾɾɾʁͰԿճϋϚͬͨΓʣ • ORϚοϐϯάˍRDBར༻࣌ͷN+1ˠEager loader ͰରॲՄೳ • ϑϩϯτΤϯυϑϨʔϜϫʔΫͱͷซ༻ɺWebpack ͷ׆༻ • GitͰͷιʔείʔυཧํ๏ɺ͓ΑͼGithub, GitLab ͷར༻ํ๏
ࠓޙΓ͍ͨ͜ͱ • LaravelͷΑΓਂ͍ཧղ • AWSͷษڧʢDBͷෳߏͱίʔυͷؔͳͲʣ • Javaͷֶशʢ੩తܕ͚ݴޠͷֶशʣ • ϙʔτϑΥϦΦαΠτͷ࡞ʢWordPressͷ༻Λ ఆʣ
ͷͨΊͷ̏ݪଇʢϓϩά ϥϛϯάʹݶΒͣʣ 1. ຊਓͷదਖ਼ɾ࠽ೳʢੜ·Ε࣋ͬͨݸੑʣ 2. ྗ 3. ϝϯλʔ 1ͳΜͱͳΒͳ͍ɺͰ̎ͱ̏ࣗ ྗͰͳΜͱ͔Ͱ͖Δʂʂʂ
͓ࣄΛ͝հ͍ͩ͘͞ʂ ͝࿈བྷɺ͓ख͓͔͚͍ͨ͠·͕͢ʮcompassʯˠຊΠϕϯ τͷࢀՃऀҰཡˠʮRukaʯΛ͓୳͍͖ͨͩ͠ɺ͔ͦ͜Β FacebookΞΧϯτˠϝοηϯδϟʔΑΓ͓͍߹Θͤ͘ ͍ͩ͞ʂʢFacebook໓ଟʹΞΫηε͠ͳ͍ͷͰɺ༑ୡਃ ͳͲͰͳ͘ϝοηϯδϟʔͰ͝࿈བྷΛ͓ئ͍͠·͢ʣ ɹࢿྉʹؒҧ͍ʢࢲ͕צҧ͍͍ͯ͠Δ෦ͳͲʣͳͲ͋Ε ࢦఠ͍͚ͯͨͩ͠Δͱ͋Γ͕͍ͨͰ͕͢ɺ୯ͳΔ㒷ᨱதই ইͭ͘ͷͰΊ͍ͯͩ͘͞ɾɾɾɻ ϑΫϩͷࣸਅ͕ҹͰ͢ɻ
बۀઌܾ·Γ·ͨ͠ɻ෭ۀͱ͓ͯ͠͠ख͍Ͱ ͖Δ͜ͱ͕͋͠ΕɺԿଔΑΖ͓͘͠ئ͍͍ͨ͠ ·͢ɻ
ΞϖϯσΟΫε ֓೦ͷઆ໌ ͓͢͢Ίͷॻ੶ͳͲ
ˎ2 CRUD • ӈਤͷΑ͏ͳERਤͰࣔͤΔσʔλϕʔε ͷใ܈ʹର͠ҎԼͷૢ࡞Λ͢Δ͜ ͱɻ • CreateʢσʔλͷੜʣINSERT tableA into
dataB; • ReadʢσʔλͷऔಘʣSELECT hoge FROM tableA • Updateʢσʔλͷߋ৽ʣUPDATE tableA SET price=1000 where id=1; • DeleteʢσʔλͷআʣDELETE FROM tableA where id=1; ը૾ࢀরݩɿhttps://www.mysql.com/common/ images/products/ MySQL_Workbench_Visual_Design_Windows.gif
ˎ3 PDO • PDO = PHP Data Object = PHP͔Βσʔλϕʔεʹଓͯ͠ߦ͏ϝ
ιουΛ·ͱΊͨΫϥεɻ • ϝϦοτ̍ɿυϥΠόʢσʔλϕʔεΛ੍ޚ͢ΔػೳʣΛΓସ ͑ΕɺMySQL͚ͩͰͳ͘PostgreSQLଞͷDBMSෳૢ࡞Մ ೳɻυϥΠόΞϓϦέʔγϣϯͱDBMSͷؒͷநϨΠϠʢந ʹಉ͡Α͏ͳػೳใ͕·ͱ·͍ͬͯΔɺϨΠϠʹʣͱ͠ ͯଘࡏ͍ͯ͠ΔͨΊɺ͜ͷΑ͏ͳར༻͕ՄೳͱͳΔɻ • ϝϦοτ̎ɿηΩϡϦςΟͷ্ʢϓϦϖΞϝϯτεςʔτϝϯ τɺhtmlspecialcharsؔͷར༻ʣ ࢀߟɿʮPHP7ʴMariaDBʗMySQLϚελʔϒοΫʯpp218
// create.php $sql_cg = "INSERT INTO posts (name, comment, postdate,
image, imgsize) VALUES ( :name, :comment, :postdate, :image, :imgsize )"; // dbconnect.php $stmh = $pdo->prepare($sql); $stmh->bindValue(':name', $nm, PDO::PARAM_STR ); $stmh->bindValue(':comment', $cm, PDO::PARAM_STR ); $stmh->bindValue(':postdate', $tm, PDO::PARAM_STR ); $stmh->bindValue(':image', $ip, PDO::PARAM_STR ); $stmh->bindValue(':imgsize', $is[3], PDO::PARAM_STR ); $stmh->execute(); // controller.php <p> <!-- ߘ࣌ --> <span><?=htmlspecialchars($value['postdate'], ENT_QUOTES)?> JST. </span> <!-- ໊લ --> <span><?=htmlspecialchars($value['name'], ENT_QUOTES)?> ͞Μ͔Βͷߘɿ</span> </p> <p> <!-- ςΩετ --> <span><? =htmlspecialchars($value['comment'], ENT_QUOTES)? ></span> </p> ϓϦϖΞϝϯτεςʔτϝϯτͷ ར༻ʢ໊લ͖ϓϨʔεϗϧμʣ ɾɾɾSQLΠϯδΣΫγϣϯʢΞϓϦέʔγϣϯ͔ΒͷSQLࢦࣔ Λ্ॻ͖͠ɺຊདྷͷҙਤͱҟͳΔσʔλϕʔεૢ࡞Λߦ͏͜ͱ ͰɺݸਓใͳͲͷػີใͷऔಘͳͲΛૂ͏߈ܸʣͷࢭ htmlspecialcharsؔͷར༻ ɾɾɾมʹؚ·ΕΔՄೳੑͷ͋ΔHTMLλάΛແޮԽ͠ɺΫϩε αΠτεΫϦϓςΟϯάʢѱҙ͋ΔεΫϦϓτΛରͷαΠτʹೖ ͠ɺͦͷαΠτΛӾཡͨ͠ਓ͕ͦͷεΫϦϓτͷϦϯΫΛ։͘Α͏ ͚Δˠ։͘ͱѱҙ͋ΔผαΠτʹඈͿΑ͏ʹʣͷࢭ PDO -Ռ1(ܝࣔ൘)Ͱͷར༻ྫ ࢀরݩɿԼهιʔείʔυʢܝࣔ൘ʣͰ͢ʂ https://gitlab.com/ruka04/bbc/tree/div14
ˎ4 σʔλϕʔε • DB = Database = ίϯϐϡʔλ্Ͱѻ͏ใͷू߹ɻେ DBMSΛࢦ͍ͯ͠Δɻ •
DBMS = Database Management System = σʔλϕʔεΛߏங͠ѻ ͏ͨΊͷιϑτΣΞɻex. MySQL, PostgreSQL, OracleDatabase, Amazon Aurora etc. • RDBMS = Relational Database Management System = ϦϨʔγϣφ ϧɾσʔλϕʔεʢෳͷදͱͦΕΒͷؔΛఆٛʣΛѻ͏ DBMS • Cf. RDS = (Amazon) Relational Database Service = AWSͷొඪɻ AWS্ͰDBMSΛ༰қʹηοτΞοϓɾӡ༻ɾεέʔϦϯάͰ͖ ΔʢΒ͍͠ʣϚωʔδυܕγεςϜɻhttps://aws.amazon.com/jp/rds/ ࢀߟɿʮϓϩʹͳΔͨΊͷWebٕज़ೖʯpp135,136ɹˎRDSΛআ͘
ˎ5 HEROKU • ແྉͰWebαΠτΛҰൠެ։͢Δ͜ͱ͕Մೳɻͨͩ͠ར༻ʹࡍͯ͠ɺ͍ͭ͘ ͔ؾΛ͚ͭΔ͖͋Γɻ • MySQLΛར༻͢Δ߹ɺΞυΦϯʹʮClearDBʯͷࢦఆʢherokuཁΫϨ δοτΧʔυใొʣͱɺʮMySQL Workbenchʯͱ͍͏ΞϓϦΛPCʹΠϯ ετʔϧ͢Δඞཁ͕͋Δʢޙऀͳ͍͚ͯ͘Δ͔ɾɾɾʣɻ
• LaravelͰը૾ߘ࣌ʹऔಘͨ͠ը૾σʔλΛ storage/app/public/images ʹอ ଘˠ public/images ͷΤΠϦΞεΛઃఆͯ͠ը૾දࣔɹͱ͍͏ΈΛਪ ͍ͯ͠Δ͕ɺherokuͩͱͦΕ͕Ͱ͖ͳ͍ʢը૾͕දࣔ͞Εͳ͍ʣɻͷͰɺը ૾ΛϑΥϧμʹอଘΛΊͯɺόΠφϦσʔλΛσʔλϕʔεʹॻ͖ࠐ Ή༷ʹมߋͨ͠ʢͷͰɺ࣮Githubʹެ։͍ͯ͠Διʔείʔυͱheroku ʹެ։͍ͯ͠ΔαΠτͷͦΕɺը૾औಘ෦ͷ͕ؔҧ͏ͷͰ͢ɾɾɾʂʣ
// app/Services/MakePostService.php // ຊͷ໊લ if(!empty($req->img_pass)) { $make->img_pass = $req->img_pass- >storeAs('public/images',
'IMG_'.$req- >id . '.jpg'); } else { $make->img_pass = "public/ images/NoImage.png"; } // app/Http/Controllers/ PhotosController.php // ຊͷ໊લ if(!empty($request->img_pass)) { // heroku༻ʹฤूɿड͚औͬͨը૾σʔλ Λbase64ͰΤϯίʔυ // $image = base64_encode(file_get_contents($reque st->image->getRealPath())); $image = base64_encode(file_get_contents($reque st->img_pass)); // $make->img_pass = $request->img_pass->storeAs('public/ images', 'IMG_'.$request->id . '.jpg'); $make->img_pass = $image; } else { $make->img_pass = base64_encode(file_get_contents("image s/NoImage.png")); } // app/Http/Controllers/ MakePostController.php public function confirm(Make $make) { return view('photos/confirm', [ ɹɹɹ// লུɹɹɹɹ 'img_pass' => str_replace('public/', 'storage/', $make->img_pass), ]); } Github্ͷίʔυ https://github.com/lukamenda26/MyRecipeBooks ެ։தαΠτ(Heroku)ͷίʔυ https://lit-springs-31811.herokuapp.com/home ɾɾɾΜʁ͍ͯ͏͔ରϑΝΠϧҧ͘ͳ͍ʁ
ˎ6 MVCϞσϧ • ·ͣσβΠϯͱϩδοΫͷ • σβΠϯʹը໘දࣔʢग़ྗʣʹView • ϩδοΫʹॲཧʢDBMSσʔλૢ ࡞ɺͷఆ ͳͲɺ֘ΞϓϦݻ
༗ͷॲཧʣʹϏδωεϩδοΫʹ Model • ͰModelͷॲཧ݁ՌʹԠͯ͡View Λม͑Δ࣌ʁը໘ΛભҠ͢Δ࣌ ʁ୭͕ͦͷৼΓ͚Λஅ͢Δʁ ˠ͜ΕΛ୲͏ͷ͕Controller ը૾ԼهαΠτ͔Β͓आΓ͠·ͨ͠ɻ IUUQTIBDLFSOPPODPNUIJOLJOHJOSFEVYXIFOBMM ZPVWFLOPXOJTNWDDBE .7$ͷ֓೦ཧղ͓ΑͼαΠτߏங࣌ͷํ๏ʹ͍ͭͯɺ ॻ੶ʮϓϩʹͳΔͨΊͷ8FCٕज़ೖʯQQd͕ͱͯ Θ͔Γ͍͢Ͱ͢ɻ
Before MVCແཧղͰߏங͢Δͱɾɾɾ FAT CONTROLLER • Controllerʹͨ͘͞ΜͷॲཧΛॻ͖ɺControllerʹϏδωεϩδοΫͷ࣮ߦ ͔ΒViewͷৼΓ͚·ͰɺϚϧνλεΫΛഎෛΘͤΔ͜ͱˠϓϩάϥϛϯ άͷੈքͰΑΖ͘͠ͳ͍ࣄଶʢϝϯςφϯε͕ͮ͠Β͘ͳΔͳͲʣ • ࠓճɺServiceͳΔͷΛ৽ͨʹ࡞͠ɺcontrollerʹͨ͘͞Μॻ͍͍ͯ
ͨॲཧΛͦͷαʔϏεҠߦ͢Δ͜ͱͰରॲ͠·ͨ͠ʢherokuͰެ։͠ ͍ͯΔαΠτ·ͩमਖ਼Ͱ͖͓ͯΒͣɺfat controllerͷ··Ͱ͢ɾɾɾʣ Model Controller View After Model Controller View Service
ࢀߟॻ੶ • খ༟հʰʮϓϩʹͳΔͨΊͷWebٕज़ೖʯ ――ͳͥɺ͋ͳͨWebγεςϜΛ։ ൃͰ͖ͳ͍ͷ͔ʱɺٕज़ධࣾɺ2010ɺhttps://www.amazon.co.jp/dp/4774142352/ ref=cm_sw_em_r_mt_dp_U_jCS6DbQRER8YC • Ӭాॱ৳ʰPHP7ʴMariaDBʗMySQLϚελʔϒοΫʱɺϚΠφϏɺ2018ɺhttps:// www.amazon.co.jp/dp/4839962340/ref=cm_sw_em_r_mt_dp_U_QES6DbCW523QV •
ᖒ༗وଞʰPHPϑϨʔϜϫʔΫ Laravel WebΞϓϦέʔγϣϯ։ൃ όʔδϣϯ 5.5 LTSରԠʱɺιγϜɺ2018ɺhttps://www.amazon.co.jp/dp/4802611846/ ref=cm_sw_em_r_mt_dp_U_YGS6DbYK27VW6 • mioʰجૅ͔ΒֶͿ Vue.js ʱɺγʔΞϯυΞʔϧݚڀॴɺ2018ɺhttps:// www.amazon.co.jp/dp/4863542453/ref=cm_sw_em_r_mt_dp_U_6IS6DbRR49SF0