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
Drupal モジュール開発入門講座 第8回 エンティティ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
アクイアジャパン Acquia Japan
November 16, 2022
Programming
0
130
Drupal モジュール開発入門講座 第8回 エンティティ
https://www.acquia.com/jp/events/webinars/drupal-module-development-vol8
アクイアジャパン Acquia Japan
November 16, 2022
Tweet
Share
More Decks by アクイアジャパン Acquia Japan
See All by アクイアジャパン Acquia Japan
Auth0 by OktaとDrupalで実践!認証付きアプリケーションの新しいアプローチ
acquiajp
0
190
Drupal 10.3の新機能紹介ウェビナー
acquiajp
0
240
DrupalCon Portland 2024 総まとめウェビナー
acquiajp
0
95
開発者必見!Acquia Cloud IDEで最高のDrupal開発を始めよう
acquiajp
0
170
触って学ぶ!デジタルアセット管理 Acquia DAM ハンズオンウェビナー
acquiajp
0
36
DrupalCon Lille 2023 総まとめウェビナー
acquiajp
0
65
コンテンツ設計手法で変更に強いアプリケーションを実現する〜ローコードによるWebアプリのバックエンド実装 #CNDF2023
acquiajp
0
380
DrupalCon Pittsburgh 2023 総まとめウェビナー
acquiajp
0
91
Acquia製品概要&Site Studioデモのご紹介
acquiajp
0
120
Other Decks in Programming
See All in Programming
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
AI時代の認知負荷との向き合い方
optfit
0
170
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.6k
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
440
並行開発のためのコードレビュー
miyukiw
0
1.2k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
140
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
620
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6.1k
Oxlint JS plugins
kazupon
1
1k
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
780
Being A Developer After 40
akosma
91
590k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
350
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
130
First, design no harm
axbom
PRO
2
1.1k
Darren the Foodie - Storyboard
khoart
PRO
2
2.4k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
180
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Mind Mapping
helmedeiros
PRO
0
90
Transcript
ୈ8ճ ΤϯςΟςΟ Drupal Ϟδϡʔϧ ։ൃೖߨ࠲
Drupal Ϟδϡʔϧ։ൃೖߨ࠲γϦʔζ – DrupalͰʮϞδϡʔϧʯͱݺΕΔɺখ͞ͳιϑτΣΞΛ࣮͢Δ͜ͱͰػೳ֦ுΛߦ ͍·͢ɻຊΣϏφʔγϦʔζͰɺDrupalͷϞδϡʔϧ։ൃʹؔ͢ΔجૅࣝΛղઆ͠· ͢ɻ – DrupalͷόοΫΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗͰΧελϜϞδϡʔϧΛ࡞Ε ΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛࢦ͢ํʹ͓͢͢ΊͰ͢ɻ –
DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛରͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ͍ ํɺॳ৺ऀ͚DrupalνϡʔτϦΞϧಈըʢຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ·Γ ·͢ɻ
ΞδΣϯμ 1. ΤϯςΟςΟͱ 2. Entity APIͰΤϯςΟςΟΛૢ࡞͢Δ 3. طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔ 4. ಠࣗͷΤϯςΟςΟλΠϓΛ࡞͢Δ
5. ࿅श
ΤϯςΟςΟͱ
DrupalαΠτʹଘࡏ͢Δσʔλ DrupalαΠτʹ ͲͷΑ͏ͳछྨͷ σʔλ͕ଘࡏͯ͠ ͍ΔͩΖ͏͔ʁ
Drupalͷσʔλͷछྨ DrupalαΠτͰѻΘΕΔσʔλओʹ4छྨʹྨ – ContentɿαΠτ๚ऀʹදࣔ͢Δ͜ͱΛతͱͨ͠ςΩ ετɺը૾ͳͲͷใɻ – ConfigurationɿαΠτͷಈ࡞ɺදࣔํ๏ͳͲΛఆٛ͢Δ ใɻ௨ৗখ͞ͳςΩετͰදݱ͞ΕΔɻ – Stateɿcronδϣϒ͕࠷ޙʹ࣮ߦ͞Εͨ࣌ࠁͳͲɺαΠτ
ͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷใɻ – SessionɿϩάΠϯ͍ͯ͠Δ͔Ͳ͏͔CookieͳͲɺݸʑ ͷαΠτ๚ऀͷαΠτͱͷΓऔΓʹؔ͢Δใɻ https://api.drupal.org/api/drupal/core%21core.api.php/group/info_types/
Drupalͷσʔλͷछྨ DrupalαΠτͰѻΘΕΔσʔλओʹ4छྨʹྨ – ContentɿαΠτ๚ऀʹදࣔ͢Δ͜ͱΛతͱͨ͠ςΩ ετɺը૾ͳͲͷใɻ – ConfigurationɿαΠτͷಈ࡞ɺදࣔํ๏ͳͲΛఆٛ͢Δ ใɻ௨ৗখ͞ͳςΩετͰදݱ͞ΕΔɻ – Stateɿcronδϣϒ͕࠷ޙʹ࣮ߦ͞Εͨ࣌ࠁͳͲɺαΠτ
ͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷใɻ – SessionɿϩάΠϯ͍ͯ͠Δ͔Ͳ͏͔CookieͳͲɺݸʑ ͷαΠτ๚ऀͷαΠτͱͷΓऔΓʹؔ͢Δใɻ https://api.drupal.org/api/drupal/core%21core.api.php/group/info_types/ ΤϯςΟςΟ ※Configurationʹؔͯ͠ɺશͯ Ͱͳ͘Ұ෦ͷσʔλ͕ߏΤϯ ςΟςΟͱͯ͠ѻΘΕΔɻ
ΤϯςΟςΟͱ – ʮίϯςϯπʯ͘͠ʮߏʯͷɺӬଓతͳετϨʔδʹ ༻͞ΕΔΦϒδΣΫτͰ͢ɻ – DrupalͰσʔλΛѻ͏ํ๏ͷҰͭͰ͋Γɺσʔλίϯςϯπ ͷϞσϦϯάΛߦ͍·͢ɻ – ΤϯςΟςΟΛάϧʔϐϯά͢ΔΤϯςΟςΟλΠϓɺ DrupalͷϓϥάΠϯγεςϜʹΑͬͯఆٛ͞Ε·͢ɻ
ΤϯςΟςΟγεςϜʹొ͢Δ༻ޠ – ΤϯςΟςΟɿߏԽ͞Εͨ୯ҰͷΞΠςϜʢΠϯελϯεʣɻ ྫɿ1ͭͷهࣄɺ1ͭͷϢʔβʔ – ΤϯςΟςΟλΠϓɿΤϯςΟςΟΛάϧʔϐϯάͨ͠ͷɻΤϯςΟςΟλΠϓ EntityTypeManagerʹΑͬͯఆٛ͞ΕΔϓϥάΠϯλΠϓͷϓϥάΠϯɻ ྫɿίϯςϯπ(ϊʔυ)ɺλΫιϊϛʔ – όϯυϧɿαϒλΠϓͱݺΕΔɻΤϯςΟςΟλΠϓΛࡉԽͨ͠ͷɻόϯυ
ϧΛ༻ҙ͢Δ͔ҙɻ௨ৗɺόϯυϧߏΤϯςΟςΟʹΑͬͯఆٛ͞ΕΔɻ ྫɿهࣄίϯςϯπλΠϓɺλά
ΤϯςΟςΟͷ֊ ΤϯςΟςΟλΠϓ όϯυϧ ΤϯςΟςΟ ίϯςϯπʢϊʔυʣ هࣄίϯςϯπλΠϓ هࣄ1 هࣄ2 جຊϖʔδίϯςϯπ λΠϓ
جຊϖʔδ1 λΫιϊϛʔλʔϜ λά λά1 λά2 Ϣʔβʔ ʢແ͠ʣ ཧऀ1 ಗ໊Ϣʔβʔ1
– ߏΤϯςΟςΟɿαΠτͷߏՄೳͳઃఆͷใΛѻ͏Φϒ δΣΫτͰ͢ɻߏγεςϜͰ༻͞Ε·͢ɻ༁Λαϙʔτ͠ ͍ͯ·͢ɻϞδϡʔϧͷΠϯετʔϧ࣌ʹಠࣗͷσϑΥϧτઃఆ ΛఏڙͰ͖·͢ɻ – ίϯςϯπΤϯςΟςΟɿઃఆՄೳͳϑΟʔϧυͱجຊϑΟʔϧ υͰߏ͞Ε·͢ɻϦϏδϣϯ༁Λαϙʔτ͍ͯ͠·͢ɻ ߏΤϯςΟςΟͱίϯςϯπΤϯςΟςΟ
ߏΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷݟ͚ํ ΤϯςΟςΟλΠϓ ΤϯςΟςΟ ίϯςϯπʢϊʔυʣ هࣄ1 هࣄ2 جຊϖʔδ1 λΫιϊϛʔλʔϜ λά1 λά2
Ϣʔβʔ ཧऀ1 ಗ໊Ϣʔβʔ1 ίϯςϯπλΠϓ هࣄίϯςϯπλΠϓ جຊϖʔδίϯςϯπλΠϓ ϘΩϟϒϥϦ λά ͲΕ͕ߏΤϯ ςΟςΟͰɺͲΕ ͕ίϯςϯπΤϯ ςΟςΟʁ
ΤϯςΟςΟλΠϓ ΤϯςΟςΟ ίϯςϯπʢϊʔυʣ هࣄ1 هࣄ2 جຊϖʔδ1 λΫιϊϛʔλʔϜ λά1 λά2 Ϣʔβʔ
ཧऀ1 ಗ໊Ϣʔβʔ1 ίϯςϯπλΠϓ هࣄίϯςϯπλΠϓ جຊϖʔδίϯςϯπλΠϓ ϘΩϟϒϥϦ λά ߏΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷݟ͚ํ ߏ ΤϯςΟςΟ ۩ମతʹɺΤϯςΟςΟ λΠϓΛఆٛ͢ΔΫϥεͷ ΞϊςʔγϣϯΛݟͯผ Ͱ͖Δ @ContentEntityTyp e o r @ConfigEntityType ίϯςϯπ ΤϯςΟςΟ
ߏΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷҧ͍ ΤϯςΟςΟλΠϓͷఆٛ ΤϯςΟςΟͷྫ σʔλͷ֨ೲॴ(DB) ߏ ΤϯςΟςΟ ConfigEntityBaseΛ֦ுͨ͠ Ϋϥε • ը૾ελΠϧ
• Ϣʔβʔׂ • ίϯςϯπλΠϓ શͯ config ςʔϒϧʹߦͱ ͯ֨͠ೲ͞Ε·͢ɻ ίϯςϯπ ΤϯςΟςΟ ContentEntityBaseΛ֦ுͨ͠ Ϋϥε • ϊʔυ • λΫιϊϛʔλʔ Ϝ • ίϝϯτ • Ϣʔβʔ ίϯςϯπΤϯςΟςΟλ Πϓ͝ͱʹςʔϒϧ͕༻ҙ ͞Εɺ֤ΤϯςΟςΟߦ ͱͯ֨͠ೲ͞Ε·͢ɻ
ΤϯςΟςΟͱ ·ͱΊ – ΤϯςΟςΟɺʮίϯςϯπʯ͘͠ʮߏʯͷɺӬଓతͳε τϨʔδʹ༻͞ΕΔΦϒδΣΫτͰ͢ɻ – DrupalͰσʔλΛѻ͏ํ๏ͷҰͭͰ͋ΓɺσʔλίϯςϯπͷϞ σϦϯάΛߦ͍·͢ɻ – ΤϯςΟςΟΤϯςΟςΟλΠϓʹΑͬͯɺ߹ʹΑͬͯ͞Β
ʹόϯυϧʹΑͬͯࡉԽ͞Ε·͢ɻ – ΤϯςΟςΟʹߏΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷ2छ ྨ͕ଘࡏ͠·͢ɻ
Entity APIͰΤϯςΟςΟΛૢ࡞͢Δ
entity_type.managerαʔϏε – entity_type.managerαʔϏεΛհͯ͠ɺΤϯςΟςΟͷಡΈࠐΈɺ࡞ɺ আͳͲͷૢ࡞͕ߦ͑·͢ɻ – entity_type.managerαʔϏεɺΤϯςΟςΟλΠϓʹґଘ͢Δ͜ͱͳ͘ɺ શͯͷΤϯςΟςΟΛѻ͏͜ͱ͕Ͱ͖·͢ɻ
ΤϯςΟςΟͷओͳૢ࡞ – 1ͭͷΤϯςΟςΟΛಡΈࠐΉ – ΤϯςΟςΟIDͷऔಘ – ΤϯςΟςΟͷόϯυϧͷऔಘ –
ΤϯςΟςΟͷ֤ϑΟʔϧυͷऔಘ $node = \Drupal::entityTypeManager()->getStorage('node')->load(1); $node->id(); // "1" $node->bundle(); // "article" $node->get('title')->value; // "Test Article" https://www.drupal.org/docs/drupal-apis/entity-api/working-with-the-entity-api https://www.metaltoad.com/blog/drupal-8-entity-api-cheat-sheet
– ΤϯςΟςΟͷ࡞ – ΤϯςΟςΟͷআ ΤϯςΟςΟͷओͳૢ࡞
$newNode = \Drupal::entityTypeManager()->getStorage('node')->create([ 'type' => 'article', 'title' => 'Entity APIͰ࡞ͨ͠هࣄ', ]); $newNode->save(); $newNode->delete();
ԋश entity_type.managerαʔϏεΛͬͯΤϯςΟςΟΛૢ࡞ͯ͠ΈΑ ͏ʂ 1. ΤϯςΟςΟͷಡΈࠐΈ 2. ΤϯςΟςΟ͕࣋ͭͷऔಘ 3. ΤϯςΟςΟͷ࡞ 4.
ΤϯςΟςΟͷআ ίʔυͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol8
طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔ
ΤϯςΟςΟλΠϓͲ͔͜Βఏڙ͞ΕΔʁ – ίΞ(αϒγεςϜ/ίΞϞδϡʔϧ ) – ίϯτϦϏϡʔτϞδϡʔϧ – ΧελϜϞδϡʔϧ
طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔํ๏ – ίʔυϕʔε͔Β@ContentEntityType @ConfigEntityTypeͰจࣈྻݕࡧ͢Δ – DevelϞδϡʔϧΛ༻͢Δ
– ΤϯςΟςΟλΠϓͷఆٛʹɺϓϥάΠϯγεςϜͷAnnotatedDiscoveryݕग़͕༻͍ΒΕ ͍ͯ·͢ɻ – ͳͷͰɺίʔυϕʔεͷPHPϑΝΠϧΛ @ContentEntityType @ConfigEntityType Ͱจ ࣈྻݕࡧ͢Δ͜ͱͰɺίʔυϕʔεʹଘࡏ͢ΔΤϯςΟςΟλΠϓΛݟ͚ͭΔ͜ͱ͕Ͱ͖·
͢ɻ ίʔυϕʔε͔Β@ContentEntityType@ConfigEntityTypeͰ จࣈྻݕࡧ͢Δ
– ίϯτϦϏϡʔτϞδϡʔϧͷʮDevelʯϞδϡʔϧΛΠϯετʔϧ/༗ޮԽͯ͠ɺ/devel/ entity/info ϖʔδʹΞΫηε͠·͢ɻ – αΠτʹଘࡏ͢ΔશͯͷΤϯςΟςΟλΠϓͷҰཡ͕֬ೝͰ͖·͢ɻʢίΞɺίϯτϦ ϏϡʔτϞδϡʔϧɺΧελϜϞδϡʔϧʣ DevelϞδϡʔϧΛ༻͢Δ
ಠࣗͷΤϯςΟςΟλΠϓΛ࡞͢Δ
ಠࣗͷΤϯςΟςΟλΠϓΛ࡞͢Δ – ΤϯςΟςΟλΠϓϓϥάΠϯγεςϜʹΑͬͯߏ͞Εͯ ͍·͢ɻ – ϓϥάΠϯλΠϓ͔ΒϓϥάΠϯΛ࡞͢ΔཁྖͰɺಠࣗͷΤ ϯςΟςΟλΠϓΛఆٛ͢Δ͜ͱ͕Ͱ͖·͢ɻ – ϓϥάΠϯͷݕग़ํ๏AnnotatedDiscovery͕༻͞Ε͍ͯ· ͢ɻܾΊΒΕͨσΟϨΫτϦߏͰPHPϑΝΠϧΛஔ͢Δ͜
ͱͰɺΤϯςΟςΟλΠϓΛఆٛͰ͖·͢ɻ
ΧελϜϞδϡʔϧͰಠࣗͷίϯςϯπΤϯςΟςΟλΠ ϓΛ࡞͢Δํ๏ ࠓճྫͱͯ͠ɺίϯςϯπΤϯςΟςΟλΠϓΛఆٛ͢Δํ๏Λհ͠·͢ɻ 1. ίϯςϯπΤϯςΟςΟλΠϓΛఆٛ͢ΔΫϥεΛ༻ҙ͠·͢ɻ a. src/EntityσΟϨΫτϦʹΫϥεϑΝΠϧΛ࡞͠·͢ɻ b. ContentEntityBaseΛ֦ுɺContentEntityInterfaceΛ࣮ͨ͠ΫϥεΛ ఆٛ͠·͢ɻ
c. ΞϊςʔγϣϯͰϝλσʔλΛهड़͠·͢ɻ d. baseFieldDefinitionsؔͰجຊϑΟʔϧυΛՃ͠·͢ɻ
ԋश ಠࣗͷίϯςϯπΤϯςΟςΟλΠϓΛఆٛͯ͠ɺར༻ͯ͠ΈΑ͏ʂ 1. ίϯςϯπΤϯςΟςΟλΠϓͷఆٛ 2. entity_type.managerαʔϏεΛ༻ͯ͠ɺ࡞ͨ͠ΤϯςΟςΟ λΠϓͷΤϯςΟςΟΛ࡞͢Δ 3. ΤϯςΟςΟ͕࡞͞Ε͍ͯΔ͔֬ೝ͢Δ ίʔυͪ͜Βˠ
https://github.com/hmaruyama/my-drupal9-module/compare/vol8
࿅श
࿅श1 DrupalͷʮΤϯςΟςΟʯʹ͍ͭͯਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. ʮίϯςϯπʯ͘͠ʮߏʯͷɺӬଓతͳετϨʔδʹ ༻͞ΕΔΦϒδΣΫτɻ 2. αΠτͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷใΛѻ͏σʔλɻ 3. Drupalͷಈ࡞Λมߋ͢ΔPHPؔɻ 4.
Doctrine ORMΛհͯ͠σʔλૢ࡞Ͱ͖Δɻ
࿅श1 DrupalͷʮΤϯςΟςΟʯʹ͍ͭͯਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. ʮίϯςϯπʯ͘͠ʮߏʯͷɺӬଓతͳετϨʔδʹ ༻͞ΕΔΦϒδΣΫτɻ 2. αΠτͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷใΛѻ͏σʔλɻ 3. Drupalͷಈ࡞Λมߋ͢ΔPHPؔɻ 4.
Doctrine ORMΛհͯ͠σʔλૢ࡞Ͱ͖Δɻ
࿅श2 DrupalͷʮΤϯςΟςΟλΠϓʯʹ͍ͭͯਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. Plugin APIͰߏ͞Ε͍ͯΔɻ 2. ϑοΫͰΤϯςΟςΟλΠϓΛఆٛͰ͖Δɻ 3. ΤϯςΟςΟλΠϓʹඞͣόϯυϧΛ༻ҙ͢Δඞཁ͕͋Δɻ 4.
ߏԽ͞Εͨ୯ҰͷΞΠςϜɻ
࿅श2 DrupalͷʮΤϯςΟςΟλΠϓʯʹ͍ͭͯਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. Plugin APIͰߏ͞Ε͍ͯΔɻ 2. ϑοΫͰΤϯςΟςΟλΠϓΛఆٛͰ͖Δɻ 3. ΤϯςΟςΟλΠϓʹඞͣόϯυϧΛ༻ҙ͢Δඞཁ͕͋Δɻ 4.
ߏԽ͞Εͨ୯ҰͷΞΠςϜɻ
ຊͷΞδΣϯμऴྃ
ΞδΣϯμ 1. ΤϯςΟςΟͱ 2. Entity APIͰΤϯςΟςΟΛૢ࡞͢Δ 3. طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔ 4. ಠࣗͷΤϯςΟςΟλΠϓΛ࡞͢Δ
5. ࿅श
None