Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
22nd ACRi Webinar - 1Finity Tamura-san's slide
nao_sumikawa
0
110
AWS DevOps Agent x ECS on Fargate検証 / AWS DevOps Agent x ECS on Fargate
kinunori
2
220
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
Webhook best practices for rock solid and resilient deployments
glaforge
2
310
日本の85%が使う公共SaaSは、どう育ったのか
taketakekaho
1
250
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.6k
SREが向き合う大規模リアーキテクチャ 〜信頼性とアジリティの両立〜
zepprix
0
480
Context Engineeringの取り組み
nutslove
0
380
Agile Leadership Summit Keynote 2026
m_seki
1
680
20260204_Midosuji_Tech
takuyay0ne
1
160
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
ファインディの横断SREがTakumi byGMOと取り組む、セキュリティと開発スピードの両立
rvirus0817
1
1.7k
Featured
See All Featured
Building Adaptive Systems
keathley
44
2.9k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.6k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
140
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
sira's awesome portfolio website redesign presentation
elsirapls
0
150
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
170
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
1
58
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
117
110k
Utilizing Notion as your number one productivity tool
mfonobong
3
220
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
89
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
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