Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Drupal モジュール開発入門講座 第7回 プラグイン
アクイアジャパン Acquia Japan
November 02, 2022
Programming
0
27
Drupal モジュール開発入門講座 第7回 プラグイン
https://www.acquia.com/jp/events/webinars/drupal-module-development-vol7
アクイアジャパン Acquia Japan
November 02, 2022
Tweet
Share
More Decks by アクイアジャパン Acquia Japan
See All by アクイアジャパン Acquia Japan
【最終回】Drupal モジュール開発入門講座 第10回 自動テスト
acquiajp1
0
5
Drupal モジュール開発入門講座 第9回 構成
acquiajp1
0
16
DrupalCamp DEN 2023 Iwakuniの魅力を一挙ご紹介! #DrupalCampDEN
acquiajp1
0
26
直近のプロダクトアップデート総まとめ
acquiajp1
0
25
リリース直前!Drupal 10に備えるためのキャッチアップウェビナー
acquiajp1
0
30
【オンラインハンズオン】Docker+LandoでCMS環境を構築してみよう #Drupal #CNDT2022
acquiajp1
0
18
Drupal モジュール開発入門講座 第8回 エンティティ
acquiajp1
0
21
Drupal モジュール開発入門講座 第6回 イベント
acquiajp1
0
34
Drupal モジュール開発入門講座 第5回 サービス
acquiajp1
0
41
Other Decks in Programming
See All in Programming
新卒でサービス立ち上げから Hasuraを使って3年経った振り返り
yutorin
0
240
10年以上続くプロダクトの フロントエンド刷新プロジェクトのふりかえり
yotahada3
2
360
What's new in Shopware 6.5
shyim
0
130
2023年にクル(かもしれない)通信ミドルウェア技術(仮)
s_hosoai
0
230
Hono v3 - Do Everything, Run Anywhere, But Small, And Faster
yusukebe
4
140
NGK2023S - OCaml最高! スマホ開発にも使えちゃう?!
haochenxie
0
120
Form実装基本を学び直してみた
hyugatsukui
0
250
Step Functions Distributed Map を使ってみた
codemountains
0
120
Showkase、Paparazziを用いたビジュアルリグレッションテストの導入にチャレンジした話 / MoT TechTalk #15
mot_techtalk
0
150
OSSから学んだPR Descriptionの書き方
fugakkbn
4
140
データドリブンな組織の不正検知
fkubota
0
320
Zynq MP SoC で楽しむエッジコンピューティング ~RTLプログラミングのススメ~
ryuz88
0
410
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
69
7.6k
GraphQLとの向き合い方2022年版
quramy
20
9.9k
Web development in the modern age
philhawksworth
197
9.6k
For a Future-Friendly Web
brad_frost
166
7.8k
Designing Experiences People Love
moore
130
22k
Creatively Recalculating Your Daily Design Routine
revolveconf
207
11k
Stop Working from a Prison Cell
hatefulcrawdad
263
18k
Into the Great Unknown - MozCon
thekraken
2
310
Navigating Team Friction
lara
177
12k
Design by the Numbers
sachag
271
18k
5 minutes of I Can Smell Your CMS
philhawksworth
198
18k
Raft: Consensus for Rubyists
vanstee
130
5.7k
Transcript
ୈ7ճ ϓϥάΠϯ Drupal Ϟδϡʔϧ ։ൃೖߨ࠲
Drupal Ϟδϡʔϧ։ൃೖߨ࠲γϦʔζ – DrupalͰʮϞδϡʔϧʯͱݺΕΔɺখ͞ͳιϑτΣΞΛ࣮͢Δ͜ͱͰػೳ֦ுΛ ߦ͍·͢ɻຊΣϏφʔγϦʔζͰɺDrupalͷϞδϡʔϧ։ൃʹؔ͢ΔجૅࣝΛղઆ ͠·͢ɻ – DrupalͷόοΫΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗͰΧελϜϞδϡʔϧΛ࡞ ΕΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛࢦ͢ํʹ͓͢͢ΊͰ͢ɻ –
DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛରͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ ͍ํɺॳ৺ऀ͚DrupalνϡʔτϦΞϧಈըʢຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ ·Γ·͢ɻ
ΞδΣϯμ 1. ϓϥάΠϯͱ 2. ϓϥάΠϯλΠϓΛར༻ͯ͠ϓϥάΠϯΛ࡞͢Δ 3. Drupal͕ϓϥάΠϯΛݕग़͢Δํ๏ 4. طଘͷϓϥάΠϯλΠϓΛݟ͚ͭΔ 5.
ಠࣗͷϓϥάΠϯλΠϓΛ࡞͢Δ 6. ࿅श
ϓϥάΠϯͱ
ϓϥάΠϯͷ֓ཁ – DrupalͷϓϥάΠϯγεςϜͱɺಛఆͷจ຺Ͱ܁Γฦ͠ൃੜ͢Δ ࣄฑʹରԠ͢ΔͨΊͷɺ࠶ར༻ՄೳͳΈͰ͢ɻ – Ϟδϡʔϧ/αϒγεςϜʹΑͬͯɺػೳͷܗ͕ఆٛ͞ΕɺଞͷϞ δϡʔϧͰɺಛఆͷಈ࡞Λ࣋ͭϓϥάΠϯΛ࡞Ͱ͖·͢ɻ – ࣅͨΑ͏ͳػೳΛ࣋ͭϓϥάΠϯɺಉ͡ϓϥάΠϯλΠϓʹଐ͠ ·͢ɻ
– DrupalͷϓϥάΠϯγεςϜɺDrupalݻ༗ͷσβΠϯύλʔϯͱݴ ͑·͢ɻ
– DrupalͷϒϩοΫɾɾɾ – ϒϩοΫϨΠΞτͷը໘ͰҙͷϦʔδϣ ϯʹஔՄೳ – ϖʔδ୯Ґɺϩʔϧ୯ҐͷӾཡ੍ޚ͕Մೳ – ༁͕Մೳ –
ͱ͍͏ɺڞ௨ͷΠϯλʔϑΣʔεΛ͍࣋ͬͯΔ – ϓϥάΠϯγεςϜʹΑͬͯɺ֤ϒϩοΫʹڞ௨ͷ ΠϯλʔϑΣʔεΛ࣋ͨͤͭͭɺܾΊΒΕͨൣғ ͰΧελϚΠζͰ͖Δ ϓϥάΠϯͷྫɿϒϩοΫ
ϓϥάΠϯγεςϜʹొ͢Δ༻ޠ – ϓϥάΠϯɿަՄೳͳখ͞ͳػೳɻΧελϜϞδϡʔϧͰ ҙͷϓϥάΠϯλΠϓͷϓϥάΠϯΛ࡞Ͱ͖ΔɻϓϥάΠϯ ɺDrupalίʔυͷҙͷॴͰݕग़ɺΠϯελϯεԽ͞Ε Δɻ – ϓϥάΠϯλΠϓɿϓϥάΠϯΛάϧʔϐϯάͨ͠ͷɻϓϥά ΠϯϚωʔδϟ(ޙड़)ʹΑͬͯϓϥάΠϯλΠϓ͕ఆٛ͞ΕΔɻ
ϓϥάΠϯλΠϓ ϓϥάΠϯ Πϯελϯε Block (ίΞͷBlock αϒεεςϜͰ ఆٛ) Search form (ίΞͷSearchϞδϡʔϧͰఆٛ)
Search form (narrow) Search form (wide) Language switche r (ίΞͷLanguageϞδϡʔϧͰఆٛ) Language switcher ϓϥάΠϯλΠϓͱϓϥάΠϯ
ଞʹ৭ʑɺϓϥάΠϯλΠϓͱϓϥάΠϯ ϓϥάΠϯλΠϓ ϓϥάΠϯ FieldFormatte r (ίΞͷFieldαϒγεςϜͰఆٛ) Plain text Trimmed ImageEffec
t (ίΞͷImageϞδϡʔϧͰఆٛ) Scale Crop Resize ViewsStyl e (ίΞͷViewsϞδϡʔϧͰఆٛ) Unformatted list HTML list
ϓϥάΠϯͱ ·ͱΊ – ϓϥάΠϯγεςϜͱɺಛఆͷจ຺Ͱ܁Γฦ͠ൃੜ͢Δࣄฑʹ ରԠ͢ΔͨΊͷɺ࠶ར༻ՄೳͳΈͰ͢ɻ – ϓϥάΠϯͱɺަՄೳͳখ͞ͳػೳͰ͢ɻ – ϓϥάΠϯλΠϓͱɺϓϥάΠϯΛάϧʔϐϯάͨ͠ͷͰ͢ɻ
ϓϥάΠϯλΠϓΛར༻ͯ͠ ϓϥάΠϯΛ࡞͢Δ
ϓϥάΠϯλΠϓΛར༻ͯ͠ϓϥάΠϯΛ࡞͢Δํ๏ ϓϥάΠϯλΠϓʹΑͬͯํ๏ଟগҟͳΓ·͕͢ɺ͜͜Ͱ AnnotatedClassDiscoveryͷݕग़ํ๏(ޙड़)͕ར༻͞Ε͍ͯΔྫΛհ͠· ͢ɻ 1. దͳσΟϨΫτϦʹphpϑΝΠϧΛஔͯ͠ɾɾɾ a. ඞཁͳϝιου͕ఆٛ͞ΕΔΑ͏ʹɺϓϥάΠϯΠϯλʔϑΣʔε Λ࣮͠·͢ɻجຊΫϥε͕ఏڙ͞Ε͍ͯΔ߹ͦΕΛextends ͠·͢ɻ
b. ΫϥεϑΝΠϧʹదͳΞϊςʔγϣϯΛهड़͠·͢ɻ c. ඞཁͳϝιουΛهड़͠·͢ɻ
ϒϩοΫϓϥάΠϯλΠϓͷϓϥάΠϯΛ࡞͢Δྫ <?php namespace Drupal\marucha\Plugin\Block; use Drupal\Core\Block\BlockBase; /** * Provide a
custom block. * * @Block( * id = "marucha_block", * admin_label = @Translation("Marucha Block"), * ) */ class MaruchaBlock extends BlockBase { /** * {@inheritDoc} */ public function build() { return ['#markup' => $this->t('This is a Block!'),]; } } src/Plugin/Block/MaruchaBlock.php ΞϊςʔγϣϯͰ ϒϩοΫID ཧ༻ϥϕϧΛ ఆٛ͢Δ ࡞ͨ͠ϒϩοΫ ཧը໘ͷϒϩοΫϨΠΞτ ϖʔδͰαΠτʹஔͰ͖ΔΑ ͏ʹͳΔ build() ϝιουͰ ϨϯμϦϯάྻ Λฦ٫͢Δ
ԋश ϒϩοΫϓϥάΠϯλΠϓͷϓϥάΠϯΛ࡞ͯ͠ΈΑ͏ʂ 1. ϞδϡʔϧͷσΟϨΫτϦԼʹ src/Plugin/Block/MaruchaBlock.php ϑΝΠϧΛ࡞͢Δ 2. BlockBaseΛ֦ு͢Δ 3. ΞϊςʔγϣϯͰϒϩοΫͷϝλσʔλΛఆٛ͢Δ
4. ඞཁͳϝιουΛ࣮͢Δ 5. Drupalཧը໘͔Β ϒϩοΫϨΠΞτ ʹҠಈͯ͠ɺ ҙͷϦʔδϣϯʹ࡞ͨ͠ϒϩοΫϓϥάΠϯΛஔ͢Δ ίʔυͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol7
Drupal͕ϓϥάΠϯΛݕग़͢Δํ๏
ϓϥάΠϯσΟεΧόϦ ϓϥάΠϯσΟεΧόϦ(Plugin Discovery)ͱݺΕΔɺίʔυϕʔε্Ͱϓ ϥάΠϯΛݕग़͢Δํ๏͕4ͭଘࡏ͠·͢ɻ ୭͕ɺ͍ͭɺϓϥάΠϯσΟεΧόϦΛؾʹ͢Δඞཁ͕͋Δ͔ʁ – ಠࣗͷϓϥάΠϯλΠϓΛ࡞͢Δ໘ɿϓϥάΠϯϚωʔδϟΫϥε ͷఆٛͷࡍʹɺ͍ͣΕ͔ͷݕग़ํ๏Λબ͢Δඞཁ͕͋Γ·͢ɻ –
ϓϥάΠϯΛ࡞͢Δ໘ɿϓϥάΠϯλΠϓ͕ར༻͢Δݕग़ํ๏ʹ ଇ࣮ͬͯ͢Δඞཁ͕͋Γ·͢ɻ
ϓϥάΠϯσΟεΧόϦ 4ͭͷҟͳΔํ๏ – AnnotatedClassDiscoveryɿdocblockͰϝλσʔλΛಡΈࠐΉํ๏Ͱ͢ɻϓϥάΠϯΛ࡞ ͢ΔଆɺܾΊΒΕͨσΟϨΫτϦߏͰϓϥάΠϯΫϥεΛஔͯ͠ɺΞϊςʔ γϣϯͰϝλσʔλΛఆٛ͠·͢ɻ΄ͱΜͲͷϓϥάΠϯλΠϓ͕͜ͷݕग़ํ๏Λར༻ ͍ͯ͠·͢ɻ – YamlDiscoveryɿYMLϑΝΠϧͰϝλσʔλΛಡΈࠐΉํ๏Ͱ͢ɻϓϥάΠϯΛ࡞͢Δ ଆɺܾΊΒΕͨϑΝΠϧ໊ͰYMLϑΝΠϧΛஔͯ͠ɺYMLܗࣜͰϝλσʔλΛఆٛ
͠·͢ɻMenuLinkBreakpointsͳͲͷҰ෦ͷϓϥάΠϯλΠϓͰར༻͞Ε͍ͯ·͢ɻ – StaticDiscovery – HookDiscovery ΄ͱΜͲར༻͞Ε͍ͯͳ͍ʁ
طଘͷϓϥάΠϯλΠϓΛݟ͚ͭΔ
ϓϥάΠϯλΠϓͲ͔͜Βఏڙ͞ΕΔʁ – ίΞ(αϒγεςϜ/ίΞϞδϡʔϧ ) – ίϯτϦϏϡʔτϞδϡʔϧ – ΧελϜϞδϡʔϧ
طଘͷϓϥάΠϯλΠϓΛݟ͚ͭΔํ๏ – ΞϊςʔγϣϯΫϥεΛ୳͢ – *.services.yml͔Β୳͢
ΞϊςʔγϣϯΫϥεΛ୳͢ – ݱ࣌Ͱ΄ͱΜͲͷϓϥάΠϯλΠϓ͕ʮAnnotatedClassDiscoveryʯΛ༻ͯ͠ ϓϥάΠϯΛݕग़͠·͢ɻ – ͔ͭɺݱ࣌ͰΞϊςʔγϣϯϓϥάΠϯγεςϜͰͷΈ༻͞Ε͍ͯ·͢ɻ – ͭ·ΓΞϊςʔγϣϯΫϥεΛ୳͢͜ͱͰɺ΄ͱΜͲͷϓϥάΠϯλΠϓΛݟ͚ͭΔ ͜ͱ͕Ͱ͖·͢ɻ –
api.drupal.orgͰɺAnnotationsϖʔδ͔ΒDrupalίΞʹଘࡏ͢ΔΞϊςʔγϣϯΫ ϥεͷҰཡΛݟΔ͜ͱ͕Ͱ͖·͢ɻ – Drupalιʔείʔυ্͔ΒϑΝΠϧݕࡧͰݟ͚ͭΔ͜ͱ͕Ͱ͖·͢ɻ
*.services.yml͔Β୳͢ – ϓϥάΠϯλΠϓͷ֤ϓϥάΠϯɺϓϥάΠϯϚωʔδϟʢαʔϏεʣΛհ͠ ͯݺͼग़͞Ε·͢ɻ – *.services.ymlʹొ͞ΕͨϓϥάΠϯϚωʔδϟͷϚγϯ໊ plugin.manager.* ͱ͍͏໊લʹͳ͍ͬͯΔͷ͕ଟ͍Ͱ͢ɻ※શͯͰແ͍ – ࣮֬ͳํ๏Ͱແ͍Ͱ͕͢ɺ*services.ymlϑΝΠϧΛ
plugin.manager. Ͱจࣈ ྻݕࡧ͢Δ͜ͱͰҰ෦ͷϓϥάΠϯλΠϓΛݟ͚ͭΔ͜ͱ͕Ͱ͖·͢ɻ
ࢀߟ) ViewsϞδϡʔϧͷ߹ – ίΞͷViewsϞδϡʔϧ͔Βɺ͍͔ͭ͘ͷ ϓϥάΠϯλΠϓ͕ఏڙ͞Ε͍ͯ·͢ɻ – Viewsͷ߹ɺDrupalཧը໘ͷϨϙʔ τ > Views
ϓϥάΠϯ ͷϖʔδ͔Βɺ ViewsϞδϡʔϧͰఏڙ͞Ε͍ͯΔϓϥά ΠϯλΠϓҰཡΛݟΔ͜ͱ͕Ͱ͖·͢ɻ
ಠࣗͷϓϥάΠϯλΠϓΛ࡞͢Δ
ΧελϜϞδϡʔϧͰಠࣗͷϓϥάΠϯλΠϓΛ ࡞͢Δํ๏ AnnotatedClassDiscoveryͷݕग़ํ๏Λ༻͍ͨྫΛհ͠·͢ɻ 1. ϓϥάΠϯϚωʔδϟΫϥεΛ༻ҙ͠·͢ɻ a. ΫϥεͰϓϥάΠϯͷݕग़ํ๏ఆ͍͖ٛͯ͠·͢ɻ b. ࡞ͨ͠ΫϥεΛ*.services.ymlʹొ͠·͢ɻ 2.
ΞϊςʔγϣϯΫϥεΛ༻ҙ͠·͢ɻ a. ϓϥάΠϯͰར༻͍ͨ͠ϝλσʔλΛఆٛ͠·͢ɻ 3. ΠϯλʔϑΣʔεΛ༻ҙ͠·͢ɻ a. ϓϥάΠϯͰ࣮ͯ͠΄͍͠ϝιουΛఆٛ͠·͢ɻ 4. جຊΫϥεΛ༻ҙ͠·͢ɻʢΦϓγϣϯʣ a. ΠϯλʔϑΣʔεΛ࣮ͯ͠جຊΫϥεΛ༻ҙͯ͠ɺϝιουͷσϑΥϧτͷॲཧΛهड़ ͠·͢ɻ
ϓϥάΠϯϚωʔδϟͱ – ϓϥάΠϯϚωʔδϟɺ࣍ͷ͜ͱΛߦ͍·͢ɻ – ৽͍͠ϓϥάΠϯλΠϓͷఆٛ – ϓϥάΠϯͷݕग़ํ๏ͷఆٛ – ϓϥάΠϯͷݕग़ͱΠϯελϯεԽ –
ϓϥάΠϯϚωʔδϟαʔϏεͱͯ͠ఆٛ͞Ε·͢ɻ αʔϏεͷϚγϯ໊ʹɺplugin.manager.* ͷ໋໊نଇ͕Α͘ར ༻͞Ε·͢ɻ
ϓϥάΠϯϚωʔδϟΛ༻͢Δ ϓϥάΠϯϚωʔδϟαʔϏεΛݺͼग़ͯ͠ɾɾ – ར༻ՄೳͳϓϥάΠϯͷҰཡΛऔಘ͢Δ – ಛఆͷϓϥάΠϯΛऔಘ͢Δ –
ϓϥάΠϯͷߏࡁΈΠϯελϯεΛ࡞͢Δ $type = \Drupal::service('plugin.manager.tapioca'); $plugin_definitions = $type->getDefinitions(); $plugin_definition = $type->getDefinition('tapioca_milk_tea'); $plugin = $type->createInstance('tapioca_milk_tea', ['of' => 'configuration values']);
ԋश ಠࣗͷϓϥάΠϯλΠϓΛఆٛͯ͠ɺར༻ͯ͠ΈΑ͏ʂ 1. ϓϥάΠϯλΠϓͷఆٛ 2. ϓϥάΠϯϚωʔδϟΛ༻ͯ͠ɺ࡞ͨ͠ϓϥάΠϯλΠϓͷϓϥά ΠϯΛݺͼग़͢ 3. ࡞ͨ͠ϓϥάΠϯλΠϓͰϓϥάΠϯΛ࡞͢Δ ίʔυͪ͜Βˠ
https://github.com/hmaruyama/my-drupal9-module/compare/vol7
࿅श
࿅श1 DrupalͷʮϓϥάΠϯʯʹ͍ͭͯਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. Drupalͷಈ࡞Λมߋ͢ΔPHPؔɻ 2. ʮϞδϡʔϧʯͷผ໊ɻ 3. ϓϥάΠϯλΠϓʹάϧʔϐϯά͞ΕΔɺަՄೳͳػೳɻ
࿅श1 DrupalͷʮϓϥάΠϯʯʹ͍ͭͯਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. Drupalͷಈ࡞Λมߋ͢ΔPHPؔɻ 2. ʮϞδϡʔϧʯͷผ໊ɻ 3. ϓϥάΠϯλΠϓʹάϧʔϐϯά͞ΕΔɺަՄೳͳػೳɻ
࿅श2 ϓϥάΠϯσΟεΧόϦʹ͍ͭͯਖ਼͘͠ͳ͍هड़Λબ͍ͯͩ͘͠͞ɻ 1. DrupalίΞͰAnnotatedClassDiscoveryͱݺΕΔݕग़ํ๏ͷΈ ఏڙ͞Ε͍ͯΔɻ 2. ϓϥάΠϯϚωʔδϟͰɺϓϥάΠϯλΠϓ͕༻͢Δݕग़ํ๏Λ ఆٛ͢Δɻ 3. ಠࣗʹݕग़ํ๏Λఆٛ͢Δ͜ͱ͕Ͱ͖Δɻ
࿅श2 ϓϥάΠϯσΟεΧόϦʹ͍ͭͯਖ਼͘͠ͳ͍هड़Λબ͍ͯͩ͘͠͞ɻ 1. DrupalίΞͰAnnotatedClassDiscoveryͱݺΕΔݕग़ํ๏ͷΈ ఏڙ͞Ε͍ͯΔɻ 2. ϓϥάΠϯϚωʔδϟͰɺϓϥάΠϯλΠϓ͕༻͢Δݕग़ํ๏Λ ఆٛ͢Δɻ 3. ಠࣗʹݕग़ํ๏Λఆٛ͢Δ͜ͱ͕Ͱ͖Δɻ
ຊͷΞδΣϯμऴྃ
ΞδΣϯμ 1. ϓϥάΠϯͱ 2. ϓϥάΠϯλΠϓΛར༻ͯ͠ϓϥάΠϯΛ࡞͢Δ 3. Drupal͕ϓϥάΠϯΛݕग़͢Δํ๏ 4. طଘͷϓϥάΠϯλΠϓΛݟ͚ͭΔ 5.
ಠࣗͷϓϥάΠϯλΠϓΛ࡞͢Δ 6. ࿅श
None