Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Drupal モジュール開発入門講座 第6回 イベント
アクイアジャパン Acquia Japan
October 19, 2022
Programming
0
32
Drupal モジュール開発入門講座 第6回 イベント
https://www.acquia.com/jp/events/webinars/drupal-module-development-vol6
アクイアジャパン Acquia Japan
October 19, 2022
Tweet
Share
More Decks by アクイアジャパン Acquia Japan
See All by アクイアジャパン Acquia Japan
Drupal モジュール開発入門講座 第9回 構成
acquiajp1
0
15
DrupalCamp DEN 2023 Iwakuniの魅力を一挙ご紹介! #DrupalCampDEN
acquiajp1
0
26
直近のプロダクトアップデート総まとめ
acquiajp1
0
25
リリース直前!Drupal 10に備えるためのキャッチアップウェビナー
acquiajp1
0
29
【オンラインハンズオン】Docker+LandoでCMS環境を構築してみよう #Drupal #CNDT2022
acquiajp1
0
18
Drupal モジュール開発入門講座 第8回 エンティティ
acquiajp1
0
21
Drupal モジュール開発入門講座 第7回 プラグイン
acquiajp1
0
25
Drupal モジュール開発入門講座 第5回 サービス
acquiajp1
0
38
Drupal モジュール開発入門講座 第4回 フォーム
acquiajp1
0
32
Other Decks in Programming
See All in Programming
Swift Observation
shiz
4
290
新卒でサービス立ち上げから Hasuraを使って3年経った振り返り
yutorin
0
230
和暦を正しく扱うための暦の話
nagise
10
6.5k
ITエンジニア特化型Q&Aサイトteratailを 言語、DB、クラウドなど フルリプレイスした話
leveragestech
0
410
ちょうぜつ改め21世紀ふつうのソフトウェア設計
tanakahisateru
7
6.5k
良質な技術記事を量産する秘訣 / #MeetsPro
jnchito
11
3.7k
Spring BootとKubernetesで実現する今どきのDevOps入門
xblood
0
390
Remote SSHで行うVS Codeリモートホスト開発とトラブルシューティング
smt7174
1
490
NGK2023S - OCaml最高! スマホ開発にも使えちゃう?!
haochenxie
0
120
Writing Greener Java Applications
hollycummins
0
340
フロントエンドで 良いコードを書くために
t_keshi
3
1.6k
Form実装基本を学び直してみた
hyugatsukui
0
240
Featured
See All Featured
Facilitating Awesome Meetings
lara
33
4.6k
Embracing the Ebb and Flow
colly
75
3.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
270
12k
Keith and Marios Guide to Fast Websites
keithpitt
407
21k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
15
1.2k
Build your cross-platform service in a week with App Engine
jlugia
221
17k
Scaling GitHub
holman
453
140k
The World Runs on Bad Software
bkeepers
PRO
59
5.7k
Fireside Chat
paigeccino
16
1.8k
Building Better People: How to give real-time feedback that sticks.
wjessup
346
17k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
22
1.7k
Fashionably flexible responsive web design (full day workshop)
malarkey
396
63k
Transcript
ୈ6ճ Πϕϯτ Drupal Ϟδϡʔϧ ։ൃೖߨ࠲
Drupal Ϟδϡʔϧ։ൃೖߨ࠲γϦʔζ – DrupalͰʮϞδϡʔϧʯͱݺΕΔɺখ͞ͳιϑτΣΞΛ࣮͢Δ͜ͱͰػೳ֦ுΛ ߦ͍·͢ɻຊΣϏφʔγϦʔζͰɺDrupalͷϞδϡʔϧ։ൃʹؔ͢ΔجૅࣝΛղઆ ͠·͢ɻ – DrupalͷόοΫΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗͰΧελϜϞδϡʔϧΛ࡞ ΕΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛࢦ͢ํʹ͓͢͢ΊͰ͢ɻ –
DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛରͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ ͍ํɺॳ৺ऀ͚DrupalνϡʔτϦΞϧಈըʢຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ ·Γ·͢ɻ
ΞδΣϯμ 1. Πϕϯτͱ 2. ΠϕϯτΛαϒεΫϥΠϒ͢Δ 3. ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔ 4. ಠࣗͷΠϕϯτΛ࡞ͯ͠σΟεύον͢Δ 5.
࿅श
Πϕϯτͱ
Πϕϯτͷ֓ཁ – DrupalͷΠϕϯτγεςϜͱɺDrupalͷಈ࡞ΛมߋͰ͖ΔΑ ͏ʹ͢ΔΈͰ͢ɻ – ΠϕϯτΛ༻͢Δ͜ͱͰɺίΞଞϞδϡʔϧͷίʔυΛม ߋ͢Δ͜ͱͳ͘ॲཧΛ্ॻ͖Ͱ͖·͢ɻ – DrupalͷΠϕϯτγεςϜɺSymfonyͷEventDispatcherίϯ ϙʔωϯτΛϕʔεʹ࣮͞Ε͍ͯ·͢ɻ
Πϕϯτͷ֓ཁ – DrupalͷΠϕϯτγεςϜͱɺDrupalͷಈ࡞ΛมߋͰ͖ΔΑ ͏ʹ͢ΔΈͰ͢ɻ – ΠϕϯτΛ༻͢Δ͜ͱͰɺίΞଞϞδϡʔϧͷίʔυΛม ߋ͢Δ͜ͱͳ͘ॲཧΛ্ॻ͖Ͱ͖·͢ɻ – DrupalͷΠϕϯτγεςϜɺSymfonyͷEventDispacherίϯ ϙʔωϯτΛϕʔεʹ࣮͞Ε͍ͯ·͢ɻ
Ͳ͔͜Ͱฉ͍ͨ Α͏ͳɾɾɾ
Drupal Ϟδϡʔϧ։ൃೖߨ࠲ ୈ3ճ ϑοΫ ΑΓ DrupalͷΠϕϯτγ εςϜɺϑοΫͱ ࣅ͍ͯΔʁʂ
ϑοΫͱΠϕϯτ Drupal 7 Drupal 8 Drupal 9 ɾɾɾ ɾɾɾ ϑοΫɺDrupal
Xͷ͔࣌Βݱࡏʹ͔͚ͯଘࡏ͢Δ Drupal 8Ҏ߱ʹΠϕϯτγεςϜొ Πϕϯτͷํ͕ޙൃɻͰ ͳͥΠϕϯτγεςϜ͕ಋ ೖ͞ΕͨͷͩΖ͏ʁ
ϑοΫͷܽ – ΠϕϯτΛొ͢Δͷ Ωϟογϡͷ࠶ߏஙதͷΈ – ֤ΠϕϯτʹԠͰ͖Δͷ Ϟδϡʔϧ͝ͱʹ1ճͷΈ – ΠϕϯτͷॱংΛ؆୯ʹஅͰ͖ͳ͍ ͔ͭࢦఆͰ͖ͳ͍
ΠϕϯτγεςϜ ͜ΕΒͷܽΛ Χόʔͨ͠Ϟμϯͳ ΈͰ͢ɻ
ΠϕϯτͷΈ config.save ModuleA::onConfigSave ModuleB::onSave ModuleC::notify DrupalίʔυͷͲ͔͜ʹΠ ϕϯτΛݺͼग़͢(ʹσΟε ύον͢Δ)هड़͕ଘࡏ͢Δ ίʔυͰΠϕϯτ͕ݺ ͼग़͞ΕͨΒɺΠϕϯτ
ʹඥ͍͍ͮͯΔαϒεΫ ϥΠό(PHPؔ)͕࣮ߦ ͞ΕΔ … ༏ઌɿ ̍ ༏ઌɿ ̍̌ ༏ઌɿ ̑̌ ModuleC::onSave ༏ઌɿ ̍̌̌ Πϕϯτ ࣮ߦॱংͷࢦఆՄೳʂ ಉϞδϡʔϧͰෳͷ αϒεΫϥΠόΛొ Մೳʂ ΠϕϯταϒεΫϥΠό ΠϕϯταϒεΫϥΠό ΠϕϯταϒεΫϥΠό ΠϕϯταϒεΫϥΠό
ΠϕϯτγεςϜʹొ͢Δ༻ޠ – ΠϕϯτɿࣄΛ໊ࣔ͢લɻPHPΫϥεͷఆͰఆٛ͞ΕΔɻ ྫɿConfigEvents::SAVEɺRoutingEvents::ALTER – ΠϕϯτσΟεύονϟɿγεςϜશମͰΠϕϯτΛݺͼग़͢ʢʹσΟεύο νʣΈɻevent_dispatcherαʔϏεΛར༻ͯ͠ΠϕϯτΛݺͼग़͢ɻ – ΠϕϯταϒεΫϥΠόɿϦεφʔͱݺΕΔɻΠϕϯτ͕ݺͼग़͞Εͨ࣌ʹ ࣮ߦ͍ͨ͠ॲཧͷ༰ɻEventSubscriberInterfaceΛ࣮͢ΔPHPΫϥεͰఆٛ
͞ΕΔɻ – ΠϕϯτϨδετϦɿΠϕϯταϒεΫϥΠόʔ͕ऩू͞Εɺฒସ͑ΒΕΔ ॴɻ
ϑοΫγεςϜ ΠϕϯτγεςϜ Πϕϯτ໊ hook_ Ͱ࢝·Δ໋໊نଇ͕͋Δɻ ྫɿhook_form_alter PHPΫϥεͷఆͱͯ͠ఆٛɻ ྫɿConfigEvents::SAVE ΠϕϯτΛσΟεύον͢ Δ
module_handlerαʔϏεΛར༻ͯ͠Π ϕϯτΛݺͼग़͢ɻ ྫɿ\Drupal::moduleHandler() ->invokeAll() event_dispatcherαʔϏεΛར༻ͯ͠Πϕ ϯτΛݺͼग़͢ɻ ྫɿ$event_dispatcher->dispatch($event, ConfigEvents::SAVE) ΠϕϯταϒεΫϥΠό *.moduleϑΝΠϧʹؔΛ࡞͢Δɻ ྫɿmarucha_form_alter() EventSubscriberInterfaceΛ࣮ͨ͠PHP ΫϥεʹؔΛ࡞͢Δɻ ྫɿMarucha::onConfigSave() ΠϕϯτΛαϒεΫϥΠϒ ͢Δ ಛఆͷ໊લͰؔ(ΠϕϯταϒεΫϥ Πό)Λఆٛ͢Δ͜ͱʹΑͬͯࣗಈతʹ γεςϜʹొ͞ΕΔɻ ΠϕϯταϒεΫϥΠόΫϥεͷ getSubscribedEvents()ؔͰɺαϒεΫ ϥΠϒ͍ͨ͠ΠϕϯτΛࢦఆ͢Δɻ͜ͷ ࡍʹ༏ઌΛࢦఆՄೳɻ ࢀߟ) ϑοΫͱΠϕϯτͷରԠද
ΠϕϯτͰͰ͖Δ͜ͱ – ߏΦϒδΣΫτͷมߋΛτϦΨʔͰ͖Δ – ΤϯςΟςΟλΠϓͷมߋΛτϦΨʔͰ͖Δ – ϧʔςΟϯάͷมߋ – ɾɾɾ ※࣮ɺ·ͩ·ͩϑοΫͰͰ͖Δ͜ͱͷํ͕ଟ͍ɻ
Πϕϯτͱ ·ͱΊ – ΠϕϯτͱɺDrupalͷಈ࡞ΛมߋͰ͖ΔΑ͏ʹ͢ΔΈͰ ͢ɻ – ΠϕϯτϑοΫͱࣅ͍ͯ·͕͢ɺϑοΫͷܽΛ১ͨ͠ ʮϑοΫͷΦϒδΣΫτࢦόʔδϣϯʯͱݴ͑·͢ɻ – কདྷతʹϑοΫ͕Πϕϯτʹஔ͖Θ͍ͬͯ͘ͱࢥΘΕ·͢
͕ɺݱ࣌ͰΠϕϯτͰͰ͖Δ͜ͱΑΓϑοΫͰͰ͖Δ͜ ͱͷํ͕ଟ͍Ͱ͢ɻ
ΠϕϯτΛαϒεΫϥΠϒ͢Δ
ΠϕϯτΛαϒεΫϥΠϒ͢Δํ๏ 1. ར༻͍ͨ͠ΠϕϯτΛ୳͠·͢ɻ 2. *.services.ymlϑΝΠϧΛ࡞ͯ͠ɺαϒεΫϥΠόΛDrupalʹొ ͠·͢ɻ 3. EventSubscriberInterfaceΛ࣮ͨ͠ΠϕϯταϒεΫϥΠόΫϥ εΛ࡞͠·͢ɻ 4.
αϒεΫϥΠόΫϥεͰɾɾɾ a. getSubscribedEvents()ؔΛ࣮ͯ͠ɺ Πϕϯτ໊ => ໊ؔ ͷྻΛฦ٫͠·͢ɻ b. getSubscribedEvents()ؔͰࢦఆͨؔ͠Λ࣮͠·͢ɻ
ԋश ConfigEvents::SAVEΠϕϯτΛαϒεΫϥΠϒͯ͠ΈΑ͏ʂ 1. ϞδϡʔϧσΟϨΫτϦʹmarucha.service.ymlϑΝΠϧΛ࡞ͯ͠ɺ ΠϕϯταϒεΫϥΠόΛొ͢Δ 2. ΠϕϯταϒεΫϥΠόΫϥεΛ࡞͢Δ a. getSubscribedEvents()ؔΛ࣮͢Δ b.
Πϕϯτ͕ݺͼग़͞Εͨ࣌ʹ࣮ߦ͍ͨ͠ॲཧΛؔͱ࣮ͯ͢͠ Δ ίʔυͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol6
ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔ
ΠϕϯτͲ͔͜Βఏڙ͞ΕΔʁ – Symfon y – ίΞ – ίϯτϦϏϡʔτϞδϡʔϧ – ΧελϜϞδϡʔϧ
ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔํ๏ – api.drupal.org Λࢀর͢Δ – ίʔυϕʔε͔Β @Event Ͱจࣈྻݕࡧ͢ Δ –
Devel/Web ProfilerϞδϡʔϧΛ༻͢Δ
api.drupal.org Λࢀর͢Δ – api.drupal.orgͰɺEventsϖʔδ͔ΒDrupalίΞͷશͯͷΠϕϯτͷҰཡΛݟΔ ͜ͱ͕Ͱ͖·͢ɻ – ͜͜ͰίΞͰఆٛ͞Ε͍ͯΔΠϕϯτͷΈͰ͢ɻSymfonyɺίϯτϦϏϡʔτϞ δϡʔϧɺΧελϜϞδϡʔϧͰఆٛ͞ΕͨΠϕϯτ͔͜͜ΒࢀরͰ͖·ͤΜɻ
ίʔυϕʔε͔Β @Event Ͱจࣈྻݕࡧ͢Δ – ΠϕϯτPHPΫϥεͷఆͱͯ͠ఆٛ͞Ε͍ͯ·͢ɻ – ΠϕϯτͰ͋Δ͜ͱΛࣔͨ͢ΊʹɺఆͷDocCommentʹ @Event λάΛهड़͢Δ͜ͱ͕DrupalίʔσΟϯάنͰఆΊ ΒΕ͍ͯ·͢ɻ
– Drupalιʔείʔυ͔Β @Event Ͱจࣈྻݕࡧ͢Δ͜ͱͰɺ DrupalαΠτͰར༻ՄೳͳΠϕϯτΛݟ͚ͭΔ͜ͱ͕Ͱ͖· ͢ɻ
– ίϯτϦϏϡʔτϞδϡʔϧͷʮDevelʯϞδϡʔϧΛΠϯετʔϧ/༗ޮԽͯ͠ɺ/ devel/events ϖʔδʹΞΫηε͠·͢ɻ – αΠτͰར༻ՄೳͳશͯͷΠϕϯτҰཡͱΠϕϯτʹඥͮ͘αϒεΫϥΠόҰཡ͕֬ ೝͰ͖·͢ɻʢSymfonyɺίΞɺίϯτϦϏϡʔτϞδϡʔϧɺΧελϜϞδϡʔϧʣ DevelϞδϡʔϧΛ༻͢Δ
– ίϯτϦϏϡʔτϞδϡʔϧͷʮWeb ProfilerʯϞδϡʔϧΛΠϯετʔ ϧ/༗ޮԽͯ͠ɺWeb ProfilerͷઃఆϖʔδͰEvents߲Λ༗ޮʹ͠·͢ɻ – Web ProfilerͰɺϦΫΤετຖͷݺͼग़͞ΕͨΠϕϯτҰཡͱɺ࣮ߦ͞ ΕͨΠϕϯταϒεΫϥΠόҰཡ͕֬ೝͰ͖·͢ɻ Web
ProfilerϞδϡʔϧΛ༻͢Δ
ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔํ๏ ·ͱΊ ࢀরઌ ίΞ Symfony/ίϯτϦϏϡʔ τϞδϡʔϧ/ΧελϜϞ δϡʔϧ api.drupal.org ֎෦WebαΠτ ̋
ʔ @EventͰͷจࣈྻݕࡧ ίʔυϕʔε ̋ ̋ DevelϞδϡʔϧ ରͷDrupalαΠτͷཧը໘ ̋ ̋ Web ProfilerϞδϡʔ ϧ ରͷDrupalαΠτͷཧը໘ ̋ ※ ̋ ※ ※ ϦΫΤετຖʹݺͼग़͞Εͨ/͞Εͳ͔ͬͨΠϕϯτҰཡ͕֬ೝ Ͱ͖Δ
ಠࣗͷΠϕϯτΛ࡞ͯ͠ σΟεύον͢Δ
ΧελϜϞδϡʔϧͰಠࣗͷΠϕϯτΛ࡞͢Δํ๏ 1. ΠϕϯτʹҰҙͷ໊લΛ͚·͢ɻ 2. Drupal\Component\EventDispatcher\EventΛ֦ு͢ΔΠϕϯτ ΫϥεΛ࡞͠·͢ɻ 3. event_dispatcherαʔϏεΛ༻ͯ͠ΠϕϯτΛσΟεύον ͠·͢ɻ
ԋश ಠࣗͷΠϕϯτΛఆٛͯ͠ɺར༻ͯ͠ΈΑ͏ʂ 1. ϞδϡʔϧσΟϨΫτϦʹ src/Event/MaruchaEvents.php ϑΝ ΠϧΛ࡞ͯ͠ɺΠϕϯτ໊ΛఆͰ༻ҙ͢Δ 2. src/Event/MaruchaFirstEvent.phpϑΝΠϧΛ࡞ͯ͠ɺΠϕϯτ ΫϥεΛ࣮͢Δ
3. ΠϕϯτΛσΟεύον͢Δ 4. ఆٛͨ͠ΠϕϯτΛαϒεΫϥΠϒ͢Δ ίʔυͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol6
࿅श
࿅श1 DrupalͷʮΠϕϯτʯʹ͍ͭͯਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. Drupal 9Ҏ߱ɺϑοΫશͯΠϕϯτʹஔ͖Θͬͨɻ 2. Drupal 7͔ΒίΞʹಋೖ͞Εͨɻ 3. ʮϑοΫʯͷผ໊ɻ
4. SymfonyͷEventDispacherίϯϙʔωϯτΛϕʔεʹ࣮͞Ε͓ͯΓɺΦϒ δΣΫτࢦͷίʔυͰهड़Ͱ͖Δɻ
࿅श1 DrupalͷʮΠϕϯτʯʹ͍ͭͯਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. Drupal 9Ҏ߱ɺϑοΫશͯΠϕϯτʹஔ͖Θͬͨɻ 2. Drupal 7͔ΒίΞʹಋೖ͞Εͨɻ 3. ʮϑοΫʯͷผ໊ɻ
4. SymfonyͷEventDispacherίϯϙʔωϯτΛϕʔεʹ࣮͞Ε͓ͯΓɺΦϒ δΣΫτࢦͷίʔυͰهड़Ͱ͖Δɻ
࿅श2 DrupalͷʮΠϕϯτʯʹ͍ͭͯਖ਼͘͠ͳ͍هड़Λબ͍ͯͩ͘͠͞ɻ 1. ΠϕϯταϒεΫϥΠόʹɺΦϓγϣϯͰ༏ઌॱҐΛ͚Δ͜ͱ͕Ͱ͖Δɻ 2. ಉϞδϡʔϧͰෳͷαϒεΫϥΠόΛొ͢Δ͜ͱ͕Ͱ͖Δɻ 3. module_handlerαʔϏεΛར༻ͯ͠ΠϕϯτΛσΟεύον͢Δɻ 4. ΠϕϯτΛαϒεΫϥΠϒ͢Δࡍʹɺ
Symfony\Component\EventDispatcher\EventSubscriberInterfaceΛ࣮ͨ͠Πϕ ϯταϒεΫϥΠόΫϥεΛ༻ҙ͢Δɻ
࿅श2 DrupalͷʮΠϕϯτʯʹ͍ͭͯਖ਼͘͠ͳ͍هड़Λબ͍ͯͩ͘͠͞ɻ 1. ΠϕϯταϒεΫϥΠόʹɺΦϓγϣϯͰ༏ઌॱҐΛ͚Δ͜ͱ͕Ͱ͖Δɻ 2. ಉϞδϡʔϧͰෳͷαϒεΫϥΠόΛొ͢Δ͜ͱ͕Ͱ͖Δɻ 3. module_handlerαʔϏεΛར༻ͯ͠ΠϕϯτΛσΟεύον͢Δɻ 4. ΠϕϯτΛαϒεΫϥΠϒ͢Δࡍʹɺ
Symfony\Component\EventDispatcher\EventSubscriberInterfaceΛ࣮ͨ͠Πϕ ϯταϒεΫϥΠόΫϥεΛ༻ҙ͢Δɻ
ຊͷΞδΣϯμऴྃ
ΞδΣϯμ 1. Πϕϯτͱ 2. ΠϕϯτΛαϒεΫϥΠϒ͢Δ 3. ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔ 4. ಠࣗͷΠϕϯτΛ࡞ͯ͠σΟεύον͢Δ 5.
࿅श
None