Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
The story that a non-engeneer create PHP site a...
Search
lukamenda26
December 12, 2019
Technology
240
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
Other Decks in Technology
See All in Technology
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
180
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
290
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.4k
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
210
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
1
200
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
740
⾮構造化データを価値に変える AI エージェント基盤とその組織
ivry_presentationmaterials
0
200
Metadata - Section 1: HTML Basics
mohab1
0
120
ストレスなくAIと付き合いたい!こんなときどうしてる?
namiki64
4
610
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
200
PagerDuty Tech Hub-鳴らすけれど、人は動かない
ezaki
0
180
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.6k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
530
sira's awesome portfolio website redesign presentation
elsirapls
0
460
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
220
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
Google's AI Overviews - The New Search
badams
0
1.6k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
940
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
730
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
950
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