Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Drupal モジュール開発入門講座 第6回 イベント

Drupal モジュール開発入門講座 第6回 イベント

More Decks by アクイアジャパン Acquia Japan

Other Decks in Programming

Transcript

  1. ୈ6ճ Πϕϯτ Drupal Ϟδϡʔϧ ։ൃೖ໳ߨ࠲

  2. Drupal Ϟδϡʔϧ։ൃೖ໳ߨ࠲γϦʔζ – DrupalͰ͸ʮϞδϡʔϧʯͱݺ͹ΕΔɺখ͞ͳιϑτ΢ΣΞΛ࣮૷͢Δ͜ͱͰػೳ֦ுΛ ߦ͍·͢ɻຊ΢ΣϏφʔγϦʔζͰ͸ɺDrupalͷϞδϡʔϧ։ൃʹؔ͢Δجૅ஌ࣝΛղઆ ͠·͢ɻ – DrupalͷόοΫΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗ෼ͰΧελϜϞδϡʔϧΛ࡞ ΕΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛ໨ࢦ͢ํʹ͓͢͢ΊͰ͢ɻ –

    DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛର৅ͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ ͍ํ͸ɺॳ৺ऀ޲͚DrupalνϡʔτϦΞϧಈըʢ೔ຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ ·Γ·͢ɻ
  3. ΞδΣϯμ 1. Πϕϯτͱ͸ 2. ΠϕϯτΛαϒεΫϥΠϒ͢Δ 3. ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔ 4. ಠࣗͷΠϕϯτΛ࡞੒ͯ͠σΟεύον͢Δ 5.

    ࿅श໰୊
  4. Πϕϯτͱ͸

  5. Πϕϯτͷ֓ཁ – DrupalͷΠϕϯτγεςϜͱ͸ɺDrupalͷಈ࡞ΛมߋͰ͖ΔΑ ͏ʹ͢Δ࢓૊ΈͰ͢ɻ – ΠϕϯτΛ࢖༻͢Δ͜ͱͰɺίΞ΍ଞϞδϡʔϧͷίʔυΛม ߋ͢Δ͜ͱͳ͘ॲཧΛ্ॻ͖Ͱ͖·͢ɻ – DrupalͷΠϕϯτγεςϜ͸ɺSymfonyͷEventDispatcherίϯ ϙʔωϯτΛϕʔεʹ࣮૷͞Ε͍ͯ·͢ɻ

  6. Πϕϯτͷ֓ཁ – DrupalͷΠϕϯτγεςϜͱ͸ɺDrupalͷಈ࡞ΛมߋͰ͖ΔΑ ͏ʹ͢Δ࢓૊ΈͰ͢ɻ – ΠϕϯτΛ࢖༻͢Δ͜ͱͰɺίΞ΍ଞϞδϡʔϧͷίʔυΛม ߋ͢Δ͜ͱͳ͘ॲཧΛ্ॻ͖Ͱ͖·͢ɻ – DrupalͷΠϕϯτγεςϜ͸ɺSymfonyͷEventDispacherίϯ ϙʔωϯτΛϕʔεʹ࣮૷͞Ε͍ͯ·͢ɻ

    Ͳ͔͜Ͱฉ͍ͨ
 Α͏ͳɾɾɾ
  7. Drupal Ϟδϡʔϧ։ൃೖ໳ߨ࠲ ୈ3ճ ϑοΫ ΑΓ DrupalͷΠϕϯτγ εςϜ͸ɺϑοΫͱ ࣅ͍ͯΔʁʂ

  8. ϑοΫͱΠϕϯτ Drupal 7 Drupal 8 Drupal 9 ɾɾɾ ɾɾɾ ϑοΫ͸ɺDrupal

    Xͷ࣌୅͔Βݱࡏʹ͔͚ͯଘࡏ͢Δ Drupal 8Ҏ߱ʹΠϕϯτγεςϜొ৔ Πϕϯτͷํ͕ޙൃɻͰ͸ ͳͥΠϕϯτγεςϜ͕ಋ ೖ͞ΕͨͷͩΖ͏ʁ
  9. ϑοΫͷܽ఺ – ΠϕϯτΛొ࿥͢Δͷ͸
 Ωϟογϡͷ࠶ߏஙதͷΈ – ֤Πϕϯτʹ൓ԠͰ͖Δͷ͸
 Ϟδϡʔϧ͝ͱʹ1ճͷΈ – ΠϕϯτͷॱংΛ؆୯ʹ൑அͰ͖ͳ͍
 ͔ͭࢦఆͰ͖ͳ͍

    ΠϕϯτγεςϜ͸
 ͜ΕΒͷܽ఺Λ
 Χόʔͨ͠Ϟμϯͳ࢓૊ ΈͰ͢ɻ
  10. Πϕϯτͷ࢓૊Έ config.save ModuleA::onConfigSave ModuleB::onSave ModuleC::notify DrupalίʔυͷͲ͔͜ʹΠ ϕϯτΛݺͼग़͢(ʹσΟε ύον͢Δ)هड़͕ଘࡏ͢Δ ίʔυ಺ͰΠϕϯτ͕ݺ ͼग़͞ΕͨΒɺΠϕϯτ

    ʹඥ͍͍ͮͯΔαϒεΫ ϥΠό(PHPؔ਺)͕࣮ߦ ͞ΕΔ … ༏ઌ౓ɿ 
 ̍ ༏ઌ౓ɿ 
 ̍̌ ༏ઌ౓ɿ 
 ̑̌ ModuleC::onSave ༏ઌ౓ɿ 
 ̍̌̌ Πϕϯτ ࣮ߦॱংͷࢦఆՄೳʂ ಉϞδϡʔϧͰෳ਺ͷ αϒεΫϥΠόΛొ࿥ Մೳʂ ΠϕϯταϒεΫϥΠό ΠϕϯταϒεΫϥΠό ΠϕϯταϒεΫϥΠό ΠϕϯταϒεΫϥΠό
  11. ΠϕϯτγεςϜʹొ৔͢Δ༻ޠ – Πϕϯτɿࣄ৅Λ໊ࣔ͢લɻPHPΫϥεͷఆ਺Ͱఆٛ͞ΕΔɻ
 ྫɿConfigEvents::SAVEɺRoutingEvents::ALTER – ΠϕϯτσΟεύονϟɿγεςϜશମͰΠϕϯτΛݺͼग़͢ʢʹσΟεύο νʣ࢓૊Έɻevent_dispatcherαʔϏεΛར༻ͯ͠ΠϕϯτΛݺͼग़͢ɻ – ΠϕϯταϒεΫϥΠόɿϦεφʔͱ΋ݺ͹ΕΔɻΠϕϯτ͕ݺͼग़͞Εͨ࣌ʹ ࣮ߦ͍ͨ͠ॲཧͷ಺༰ɻEventSubscriberInterfaceΛ࣮૷͢ΔPHPΫϥεͰఆٛ

    ͞ΕΔɻ – ΠϕϯτϨδετϦɿΠϕϯταϒεΫϥΠόʔ͕ऩू͞Εɺฒ΂ସ͑ΒΕΔ৔ ॴɻ
  12. ϑοΫγεςϜ ΠϕϯτγεςϜ Πϕϯτ໊ 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()ؔ਺ͰɺαϒεΫ ϥΠϒ͍ͨ͠ΠϕϯτΛࢦఆ͢Δɻ͜ͷ ࡍʹ༏ઌ౓ΛࢦఆՄೳɻ ࢀߟ) ϑοΫͱΠϕϯτͷରԠද
  13. ΠϕϯτͰͰ͖Δ͜ͱ – ߏ੒ΦϒδΣΫτͷมߋΛτϦΨʔͰ͖Δ – ΤϯςΟςΟλΠϓͷมߋΛτϦΨʔͰ͖Δ – ϧʔςΟϯάͷมߋ – ɾɾɾ ※࣮͸ɺ·ͩ·ͩϑοΫͰͰ͖Δ͜ͱͷํ͕ଟ͍ɻ

  14. Πϕϯτͱ͸ ·ͱΊ – Πϕϯτͱ͸ɺDrupalͷಈ࡞ΛมߋͰ͖ΔΑ͏ʹ͢Δ࢓૊ΈͰ ͢ɻ – Πϕϯτ͸ϑοΫͱࣅ͍ͯ·͕͢ɺϑοΫͷܽ఺Λ෷১ͨ͠
 ʮϑοΫͷΦϒδΣΫτࢦ޲όʔδϣϯʯͱ΋ݴ͑·͢ɻ – কདྷతʹ͸ϑοΫ͕Πϕϯτʹஔ͖׵Θ͍ͬͯ͘ͱࢥΘΕ·͢

    ͕ɺݱ࣌఺Ͱ͸ΠϕϯτͰͰ͖Δ͜ͱΑΓ΋ϑοΫͰͰ͖Δ͜ ͱͷํ͕ଟ͍Ͱ͢ɻ
  15. ΠϕϯτΛαϒεΫϥΠϒ͢Δ

  16. ΠϕϯτΛαϒεΫϥΠϒ͢Δํ๏ 1. ར༻͍ͨ͠ΠϕϯτΛ୳͠·͢ɻ 2. *.services.ymlϑΝΠϧΛ࡞੒ͯ͠ɺαϒεΫϥΠόΛDrupalʹొ ࿥͠·͢ɻ 3. EventSubscriberInterfaceΛ࣮૷ͨ͠ΠϕϯταϒεΫϥΠόΫϥ εΛ࡞੒͠·͢ɻ 4.

    αϒεΫϥΠόΫϥε಺Ͱɾɾɾ a. getSubscribedEvents()ؔ਺Λ࣮૷ͯ͠ɺ
 Πϕϯτ໊ => ؔ਺໊ ͷ഑ྻΛฦ٫͠·͢ɻ b. getSubscribedEvents()ؔ਺Ͱࢦఆͨؔ͠਺Λ࣮૷͠·͢ɻ
  17. ԋश ConfigEvents::SAVEΠϕϯτΛαϒεΫϥΠϒͯ͠ΈΑ͏ʂ 1. ϞδϡʔϧσΟϨΫτϦʹmarucha.service.ymlϑΝΠϧΛ࡞੒ͯ͠ɺ ΠϕϯταϒεΫϥΠόΛొ࿥͢Δ 2. ΠϕϯταϒεΫϥΠόΫϥεΛ࡞੒͢Δ a. getSubscribedEvents()ؔ਺Λ࣮૷͢Δ b.

    Πϕϯτ͕ݺͼग़͞Εͨ࣌ʹ࣮ߦ͍ͨ͠ॲཧΛؔ਺ͱ࣮ͯ͠૷͢ Δ ίʔυ͸ͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol6
  18. ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔ

  19. Πϕϯτ͸Ͳ͔͜Βఏڙ͞ΕΔʁ – Symfon y – ίΞ – ίϯτϦϏϡʔτϞδϡʔϧ – ΧελϜϞδϡʔϧ

  20. ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔํ๏ – api.drupal.org Λࢀর͢Δ – ίʔυϕʔε͔Β @Event Ͱจࣈྻݕࡧ͢ Δ –

    Devel/Web ProfilerϞδϡʔϧΛ࢖༻͢Δ
  21. api.drupal.org Λࢀর͢Δ – api.drupal.orgͰ͸ɺEventsϖʔδ͔ΒDrupalίΞͷશͯͷΠϕϯτͷҰཡΛݟΔ ͜ͱ͕Ͱ͖·͢ɻ – ͜͜Ͱ͸ίΞͰఆٛ͞Ε͍ͯΔΠϕϯτͷΈͰ͢ɻSymfonyɺίϯτϦϏϡʔτϞ δϡʔϧɺΧελϜϞδϡʔϧͰఆٛ͞ΕͨΠϕϯτ͸͔͜͜ΒࢀরͰ͖·ͤΜɻ

  22. ίʔυϕʔε͔Β @Event Ͱจࣈྻݕࡧ͢Δ – Πϕϯτ͸PHPΫϥεͷఆ਺ͱͯ͠ఆٛ͞Ε͍ͯ·͢ɻ – ΠϕϯτͰ͋Δ͜ͱΛࣔͨ͢Ίʹɺఆ਺ͷDocComment಺ʹ @Event λάΛهड़͢Δ͜ͱ͕DrupalίʔσΟϯάن໿ͰఆΊ ΒΕ͍ͯ·͢ɻ

    – Drupalιʔείʔυ͔Β @Event Ͱจࣈྻݕࡧ͢Δ͜ͱͰɺ DrupalαΠτͰར༻ՄೳͳΠϕϯτΛݟ͚ͭΔ͜ͱ͕Ͱ͖· ͢ɻ
  23. – ίϯτϦϏϡʔτϞδϡʔϧͷʮDevelʯϞδϡʔϧΛΠϯετʔϧ/༗ޮԽͯ͠ɺ/ devel/events ϖʔδʹΞΫηε͠·͢ɻ – αΠτͰར༻ՄೳͳશͯͷΠϕϯτҰཡͱΠϕϯτʹඥͮ͘αϒεΫϥΠόҰཡ͕֬ ೝͰ͖·͢ɻʢSymfonyɺίΞɺίϯτϦϏϡʔτϞδϡʔϧɺΧελϜϞδϡʔϧʣ DevelϞδϡʔϧΛ࢖༻͢Δ

  24. – ίϯτϦϏϡʔτϞδϡʔϧͷʮWeb ProfilerʯϞδϡʔϧΛΠϯετʔ ϧ/༗ޮԽͯ͠ɺWeb ProfilerͷઃఆϖʔδͰEvents߲໨Λ༗ޮʹ͠·͢ɻ – Web ProfilerͰ͸ɺϦΫΤετຖͷݺͼग़͞ΕͨΠϕϯτҰཡͱɺ࣮ߦ͞ ΕͨΠϕϯταϒεΫϥΠόҰཡ͕֬ೝͰ͖·͢ɻ Web

    ProfilerϞδϡʔϧΛ࢖༻͢Δ
  25. ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔํ๏ ·ͱΊ ࢀরઌ ίΞ Symfony/ίϯτϦϏϡʔ τϞδϡʔϧ/ΧελϜϞ δϡʔϧ api.drupal.org ֎෦WebαΠτ ̋

    ʔ @EventͰͷจࣈྻݕࡧ ίʔυϕʔε ̋ ̋ DevelϞδϡʔϧ ର৅ͷDrupalαΠτͷ؅ཧը໘ ̋ ̋ Web ProfilerϞδϡʔ ϧ ର৅ͷDrupalαΠτͷ؅ཧը໘ ̋ ※ ̋ ※ ※ ϦΫΤετຖʹݺͼग़͞Εͨ/͞Εͳ͔ͬͨΠϕϯτҰཡ͕֬ೝ Ͱ͖Δ
  26. ಠࣗͷΠϕϯτΛ࡞੒ͯ͠ 
 σΟεύον͢Δ

  27. ΧελϜϞδϡʔϧͰಠࣗͷΠϕϯτΛ࡞੒͢Δํ๏ 1. ΠϕϯτʹҰҙͷ໊લΛ෇͚·͢ɻ 2. Drupal\Component\EventDispatcher\EventΛ֦ு͢ΔΠϕϯτ ΫϥεΛ࡞੒͠·͢ɻ 3. event_dispatcherαʔϏεΛ࢖༻ͯ͠ΠϕϯτΛσΟεύον ͠·͢ɻ

  28. ԋश ಠࣗͷΠϕϯτΛఆٛͯ͠ɺར༻ͯ͠ΈΑ͏ʂ 1. ϞδϡʔϧσΟϨΫτϦʹ src/Event/MaruchaEvents.php ϑΝ ΠϧΛ࡞੒ͯ͠ɺΠϕϯτ໊Λఆ਺Ͱ༻ҙ͢Δ 2. src/Event/MaruchaFirstEvent.phpϑΝΠϧΛ࡞੒ͯ͠ɺΠϕϯτ ΫϥεΛ࣮૷͢Δ

    3. ΠϕϯτΛσΟεύον͢Δ 4. ఆٛͨ͠ΠϕϯτΛαϒεΫϥΠϒ͢Δ ίʔυ͸ͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol6
  29. ࿅श໰୊

  30. ࿅श໰୊1 DrupalͷʮΠϕϯτʯʹ͍ͭͯਖ਼͍͠هड़Λબ୒͍ͯͩ͘͠͞ɻ 1. Drupal 9Ҏ߱ɺϑοΫ͸શͯΠϕϯτʹஔ͖׵Θͬͨɻ 2. Drupal 7͔ΒίΞʹಋೖ͞Εͨɻ 3. ʮϑοΫʯͷผ໊ɻ

    4. SymfonyͷEventDispacherίϯϙʔωϯτΛϕʔεʹ࣮૷͞Ε͓ͯΓɺΦϒ δΣΫτࢦ޲ͷίʔυͰهड़Ͱ͖Δɻ
  31. ࿅श໰୊1 DrupalͷʮΠϕϯτʯʹ͍ͭͯਖ਼͍͠هड़Λબ୒͍ͯͩ͘͠͞ɻ 1. Drupal 9Ҏ߱ɺϑοΫ͸શͯΠϕϯτʹஔ͖׵Θͬͨɻ 2. Drupal 7͔ΒίΞʹಋೖ͞Εͨɻ 3. ʮϑοΫʯͷผ໊ɻ

    4. SymfonyͷEventDispacherίϯϙʔωϯτΛϕʔεʹ࣮૷͞Ε͓ͯΓɺΦϒ δΣΫτࢦ޲ͷίʔυͰهड़Ͱ͖Δɻ
  32. ࿅श໰୊2 DrupalͷʮΠϕϯτʯʹ͍ͭͯਖ਼͘͠ͳ͍هड़Λબ୒͍ͯͩ͘͠͞ɻ 1. ΠϕϯταϒεΫϥΠόʹ͸ɺΦϓγϣϯͰ༏ઌॱҐΛ෇͚Δ͜ͱ͕Ͱ͖Δɻ 2. ಉϞδϡʔϧͰෳ਺ͷαϒεΫϥΠόΛొ࿥͢Δ͜ͱ͕Ͱ͖Δɻ 3. module_handlerαʔϏεΛར༻ͯ͠ΠϕϯτΛσΟεύον͢Δɻ 4. ΠϕϯτΛαϒεΫϥΠϒ͢Δࡍʹ͸ɺ

    Symfony\Component\EventDispatcher\EventSubscriberInterfaceΛ࣮૷ͨ͠Πϕ ϯταϒεΫϥΠόΫϥεΛ༻ҙ͢Δɻ
  33. ࿅श໰୊2 DrupalͷʮΠϕϯτʯʹ͍ͭͯਖ਼͘͠ͳ͍هड़Λબ୒͍ͯͩ͘͠͞ɻ 1. ΠϕϯταϒεΫϥΠόʹ͸ɺΦϓγϣϯͰ༏ઌॱҐΛ෇͚Δ͜ͱ͕Ͱ͖Δɻ 2. ಉϞδϡʔϧͰෳ਺ͷαϒεΫϥΠόΛొ࿥͢Δ͜ͱ͕Ͱ͖Δɻ 3. module_handlerαʔϏεΛར༻ͯ͠ΠϕϯτΛσΟεύον͢Δɻ 4. ΠϕϯτΛαϒεΫϥΠϒ͢Δࡍʹ͸ɺ

    Symfony\Component\EventDispatcher\EventSubscriberInterfaceΛ࣮૷ͨ͠Πϕ ϯταϒεΫϥΠόΫϥεΛ༻ҙ͢Δɻ
  34. ຊ೔ͷΞδΣϯμ͸ऴྃ

  35. ΞδΣϯμ 1. Πϕϯτͱ͸ 2. ΠϕϯτΛαϒεΫϥΠϒ͢Δ 3. ར༻ՄೳͳΠϕϯτΛݟ͚ͭΔ 4. ಠࣗͷΠϕϯτΛ࡞੒ͯ͠σΟεύον͢Δ 5.

    ࿅श໰୊
  36. None