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

Drupal モジュール開発入門講座 第8回 エンティティ

Drupal モジュール開発入門講座 第8回 エンティティ

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

Other Decks in Programming

Transcript

  1. ୈ8ճ ΤϯςΟςΟ Drupal Ϟδϡʔϧ ։ൃೖ໳ߨ࠲

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

    DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛର৅ͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ͍ ํ͸ɺॳ৺ऀ޲͚DrupalνϡʔτϦΞϧಈըʢ೔ຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ·Γ ·͢ɻ
  3. ΞδΣϯμ 1. ΤϯςΟςΟͱ͸ 2. Entity APIͰΤϯςΟςΟΛૢ࡞͢Δ 3. طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔ 4. ಠࣗͷΤϯςΟςΟλΠϓΛ࡞੒͢Δ

    5. ࿅श໰୊
  4. ΤϯςΟςΟͱ͸

  5. DrupalαΠτʹଘࡏ͢Δσʔλ DrupalαΠτʹ͸ ͲͷΑ͏ͳछྨͷ σʔλ͕ଘࡏͯ͠ ͍ΔͩΖ͏͔ʁ

  6. Drupalͷσʔλͷछྨ DrupalαΠτͰѻΘΕΔσʔλ͸ओʹ4छྨʹ෼ྨ – ContentɿαΠτ๚໰ऀʹදࣔ͢Δ͜ͱΛ໨తͱͨ͠ςΩ ετɺը૾ͳͲͷ৘ใɻ – ConfigurationɿαΠτͷಈ࡞ɺදࣔํ๏ͳͲΛఆٛ͢Δ ৘ใɻ௨ৗ͸খ͞ͳςΩετͰදݱ͞ΕΔ܏޲ɻ – Stateɿcronδϣϒ͕࠷ޙʹ࣮ߦ͞Εͨ࣌ࠁͳͲɺαΠτ

    ͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷ৘ใɻ – SessionɿϩάΠϯ͍ͯ͠Δ͔Ͳ͏͔΍CookieͳͲɺݸʑ ͷαΠτ๚໰ऀͷαΠτͱͷ΍ΓऔΓʹؔ͢Δ৘ใɻ https://api.drupal.org/api/drupal/core%21core.api.php/group/info_types/
  7. Drupalͷσʔλͷछྨ DrupalαΠτͰѻΘΕΔσʔλ͸ओʹ4छྨʹ෼ྨ – ContentɿαΠτ๚໰ऀʹදࣔ͢Δ͜ͱΛ໨తͱͨ͠ςΩ ετɺը૾ͳͲͷ৘ใɻ – ConfigurationɿαΠτͷಈ࡞ɺදࣔํ๏ͳͲΛఆٛ͢Δ ৘ใɻ௨ৗ͸খ͞ͳςΩετͰදݱ͞ΕΔ܏޲ɻ – Stateɿcronδϣϒ͕࠷ޙʹ࣮ߦ͞Εͨ࣌ࠁͳͲɺαΠτ

    ͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷ৘ใɻ – SessionɿϩάΠϯ͍ͯ͠Δ͔Ͳ͏͔΍CookieͳͲɺݸʑ ͷαΠτ๚໰ऀͷαΠτͱͷ΍ΓऔΓʹؔ͢Δ৘ใɻ https://api.drupal.org/api/drupal/core%21core.api.php/group/info_types/ ΤϯςΟςΟ ※Configurationʹؔͯ͠͸ɺશͯ Ͱ͸ͳ͘Ұ෦ͷσʔλ͕ߏ੒Τϯ ςΟςΟͱͯ͠ѻΘΕΔɻ
  8. ΤϯςΟςΟͱ͸ – ʮίϯςϯπʯ΋͘͠͸ʮߏ੒ʯͷɺӬଓతͳετϨʔδʹ࢖ ༻͞ΕΔΦϒδΣΫτͰ͢ɻ – DrupalͰσʔλΛѻ͏ํ๏ͷҰͭͰ͋Γɺσʔλ΍ίϯςϯπ ͷϞσϦϯάΛߦ͍·͢ɻ – ΤϯςΟςΟΛάϧʔϐϯά͢ΔΤϯςΟςΟλΠϓ͸ɺ DrupalͷϓϥάΠϯγεςϜʹΑͬͯఆٛ͞Ε·͢ɻ

  9. ΤϯςΟςΟγεςϜʹొ৔͢Δ༻ޠ – ΤϯςΟςΟɿߏ଄Խ͞Εͨ୯ҰͷΞΠςϜʢΠϯελϯεʣɻ
 ྫɿ1ͭͷهࣄɺ1ͭͷϢʔβʔ – ΤϯςΟςΟλΠϓɿΤϯςΟςΟΛάϧʔϐϯάͨ͠΋ͷɻΤϯςΟςΟλΠϓ͸ EntityTypeManagerʹΑͬͯఆٛ͞ΕΔϓϥάΠϯλΠϓͷϓϥάΠϯɻ
 ྫɿίϯςϯπ(ϊʔυ)ɺλΫιϊϛʔ – όϯυϧɿαϒλΠϓͱ΋ݺ͹ΕΔɻΤϯςΟςΟλΠϓΛࡉ෼Խͨ͠΋ͷɻόϯυ

    ϧΛ༻ҙ͢Δ͔͸೚ҙɻ௨ৗɺόϯυϧ͸ߏ੒ΤϯςΟςΟʹΑͬͯఆٛ͞ΕΔɻ
 ྫɿهࣄίϯςϯπλΠϓɺλά
  10. ΤϯςΟςΟͷ֊૚ ΤϯςΟςΟλΠϓ όϯυϧ ΤϯςΟςΟ ίϯςϯπʢϊʔυʣ هࣄίϯςϯπλΠϓ هࣄ1 هࣄ2 جຊϖʔδίϯςϯπ λΠϓ

    جຊϖʔδ1 λΫιϊϛʔλʔϜ λά λά1 λά2 Ϣʔβʔ ʢແ͠ʣ ؅ཧऀ1 ಗ໊Ϣʔβʔ1
  11. – ߏ੒ΤϯςΟςΟɿαΠτͷߏ੒Մೳͳઃఆͷ৘ใΛѻ͏Φϒ δΣΫτͰ͢ɻߏ੒γεςϜͰ࢖༻͞Ε·͢ɻ຋༁Λαϙʔτ͠ ͍ͯ·͢ɻϞδϡʔϧͷΠϯετʔϧ࣌ʹಠࣗͷσϑΥϧτઃఆ ΛఏڙͰ͖·͢ɻ – ίϯςϯπΤϯςΟςΟɿઃఆՄೳͳϑΟʔϧυͱجຊϑΟʔϧ υͰߏ੒͞Ε·͢ɻϦϏδϣϯ΍຋༁Λαϙʔτ͍ͯ͠·͢ɻ ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟ

  12. ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷݟ෼͚ํ ΤϯςΟςΟλΠϓ ΤϯςΟςΟ ίϯςϯπʢϊʔυʣ هࣄ1 هࣄ2 جຊϖʔδ1 λΫιϊϛʔλʔϜ λά1 λά2

    Ϣʔβʔ ؅ཧऀ1 ಗ໊Ϣʔβʔ1 ίϯςϯπλΠϓ هࣄίϯςϯπλΠϓ جຊϖʔδίϯςϯπλΠϓ ϘΩϟϒϥϦ λά ͲΕ͕ߏ੒Τϯ ςΟςΟͰɺͲΕ ͕ίϯςϯπΤϯ ςΟςΟʁ
  13. ΤϯςΟςΟλΠϓ ΤϯςΟςΟ ίϯςϯπʢϊʔυʣ هࣄ1 هࣄ2 جຊϖʔδ1 λΫιϊϛʔλʔϜ λά1 λά2 Ϣʔβʔ

    ؅ཧऀ1 ಗ໊Ϣʔβʔ1 ίϯςϯπλΠϓ هࣄίϯςϯπλΠϓ جຊϖʔδίϯςϯπλΠϓ ϘΩϟϒϥϦ λά ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷݟ෼͚ํ ߏ੒ ΤϯςΟςΟ ۩ମతʹ͸ɺΤϯςΟςΟ λΠϓΛఆٛ͢ΔΫϥεͷ ΞϊςʔγϣϯΛݟͯ൑ผ Ͱ͖Δ @ContentEntityTyp e o r @ConfigEntityType ίϯςϯπ ΤϯςΟςΟ
  14. ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷҧ͍ ΤϯςΟςΟλΠϓͷఆٛ ΤϯςΟςΟͷྫ σʔλͷ֨ೲ৔ॴ(DB) ߏ੒
 ΤϯςΟςΟ ConfigEntityBaseΛ֦ுͨ͠ Ϋϥε • ը૾ελΠϧ

    • Ϣʔβʔ໾ׂ • ίϯςϯπλΠϓ શͯ config ςʔϒϧʹߦͱ ͯ֨͠ೲ͞Ε·͢ɻ ίϯςϯπ
 ΤϯςΟςΟ ContentEntityBaseΛ֦ுͨ͠ Ϋϥε • ϊʔυ • λΫιϊϛʔλʔ Ϝ • ίϝϯτ • Ϣʔβʔ ίϯςϯπΤϯςΟςΟλ Πϓ͝ͱʹςʔϒϧ͕༻ҙ ͞Εɺ֤ΤϯςΟςΟ͸ߦ ͱͯ֨͠ೲ͞Ε·͢ɻ
  15. ΤϯςΟςΟͱ͸ ·ͱΊ – ΤϯςΟςΟ͸ɺʮίϯςϯπʯ΋͘͠͸ʮߏ੒ʯͷɺӬଓతͳε τϨʔδʹ࢖༻͞ΕΔΦϒδΣΫτͰ͢ɻ – DrupalͰσʔλΛѻ͏ํ๏ͷҰͭͰ͋Γɺσʔλ΍ίϯςϯπͷϞ σϦϯάΛߦ͍·͢ɻ – ΤϯςΟςΟ͸ΤϯςΟςΟλΠϓʹΑͬͯɺ৔߹ʹΑͬͯ͸͞Β

    ʹόϯυϧʹΑͬͯࡉ෼Խ͞Ε·͢ɻ – ΤϯςΟςΟʹ͸ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷ2छ ྨ͕ଘࡏ͠·͢ɻ
  16. Entity APIͰΤϯςΟςΟΛૢ࡞͢Δ

  17. entity_type.managerαʔϏε – entity_type.managerαʔϏεΛհͯ͠ɺΤϯςΟςΟͷಡΈࠐΈɺ࡞੒ɺ࡟ আͳͲͷૢ࡞͕ߦ͑·͢ɻ – entity_type.managerαʔϏε͸ɺΤϯςΟςΟλΠϓʹґଘ͢Δ͜ͱͳ͘ɺ શͯͷΤϯςΟςΟΛѻ͏͜ͱ͕Ͱ͖·͢ɻ

  18. ΤϯςΟςΟͷओͳૢ࡞ – 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
  19. – ΤϯςΟςΟͷ࡞੒
 
 
 
 
 
 – ΤϯςΟςΟͷ࡟আ ΤϯςΟςΟͷओͳૢ࡞

    $newNode = \Drupal::entityTypeManager()->getStorage('node')->create([ 'type' => 'article', 'title' => 'Entity APIͰ࡞੒ͨ͠هࣄ', ]); $newNode->save(); $newNode->delete();
  20. ԋश entity_type.managerαʔϏεΛ࢖ͬͯΤϯςΟςΟΛૢ࡞ͯ͠ΈΑ ͏ʂ 1. ΤϯςΟςΟͷಡΈࠐΈ 2. ΤϯςΟςΟ͕࣋ͭ஋ͷऔಘ 3. ΤϯςΟςΟͷ࡞੒ 4.

    ΤϯςΟςΟͷ࡟আ ίʔυ͸ͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol8
  21. طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔ

  22. ΤϯςΟςΟλΠϓ͸Ͳ͔͜Βఏڙ͞ΕΔʁ – ίΞ(αϒγεςϜ/ίΞϞδϡʔϧ ) – ίϯτϦϏϡʔτϞδϡʔϧ – ΧελϜϞδϡʔϧ

  23. طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔํ๏ – ίʔυϕʔε͔Β@ContentEntityType΍ @ConfigEntityTypeͰจࣈྻݕࡧ͢Δ – DevelϞδϡʔϧΛ࢖༻͢Δ

  24. – ΤϯςΟςΟλΠϓͷఆٛʹ͸ɺϓϥάΠϯγεςϜͷAnnotatedDiscoveryݕग़͕༻͍ΒΕ ͍ͯ·͢ɻ – ͳͷͰɺίʔυϕʔε಺ͷPHPϑΝΠϧΛ @ContentEntityType ΍ @ConfigEntityType Ͱจ ࣈྻݕࡧ͢Δ͜ͱͰɺίʔυϕʔεʹଘࡏ͢ΔΤϯςΟςΟλΠϓΛݟ͚ͭΔ͜ͱ͕Ͱ͖·

    ͢ɻ ίʔυϕʔε͔Β@ContentEntityType΍@ConfigEntityTypeͰ จࣈྻݕࡧ͢Δ
  25. – ίϯτϦϏϡʔτϞδϡʔϧͷʮDevelʯϞδϡʔϧΛΠϯετʔϧ/༗ޮԽͯ͠ɺ/devel/ entity/info ϖʔδʹΞΫηε͠·͢ɻ – αΠτʹଘࡏ͢ΔશͯͷΤϯςΟςΟλΠϓͷҰཡ͕֬ೝͰ͖·͢ɻʢίΞɺίϯτϦ ϏϡʔτϞδϡʔϧɺΧελϜϞδϡʔϧʣ DevelϞδϡʔϧΛ࢖༻͢Δ

  26. ಠࣗͷΤϯςΟςΟλΠϓΛ࡞੒͢Δ

  27. ಠࣗͷΤϯςΟςΟλΠϓΛ࡞੒͢Δ – ΤϯςΟςΟλΠϓ͸ϓϥάΠϯγεςϜʹΑͬͯߏ੒͞Εͯ ͍·͢ɻ – ϓϥάΠϯλΠϓ͔ΒϓϥάΠϯΛ࡞੒͢ΔཁྖͰɺಠࣗͷΤ ϯςΟςΟλΠϓΛఆٛ͢Δ͜ͱ͕Ͱ͖·͢ɻ – ϓϥάΠϯͷݕग़ํ๏͸AnnotatedDiscovery͕࢖༻͞Ε͍ͯ· ͢ɻܾΊΒΕͨσΟϨΫτϦߏ੒ͰPHPϑΝΠϧΛ഑ஔ͢Δ͜

    ͱͰɺΤϯςΟςΟλΠϓΛఆٛͰ͖·͢ɻ
  28. ΧελϜϞδϡʔϧͰಠࣗͷίϯςϯπΤϯςΟςΟλΠ ϓΛ࡞੒͢Δํ๏ ࠓճ͸ྫͱͯ͠ɺίϯςϯπΤϯςΟςΟλΠϓΛఆٛ͢Δํ๏Λ঺հ͠·͢ɻ 1. ίϯςϯπΤϯςΟςΟλΠϓΛఆٛ͢ΔΫϥεΛ༻ҙ͠·͢ɻ a. src/EntityσΟϨΫτϦ಺ʹΫϥεϑΝΠϧΛ࡞੒͠·͢ɻ b. ContentEntityBaseΛ֦ுɺContentEntityInterfaceΛ࣮૷ͨ͠ΫϥεΛ ఆٛ͠·͢ɻ

    c. ΞϊςʔγϣϯͰϝλσʔλΛهड़͠·͢ɻ d. baseFieldDefinitionsؔ਺ͰجຊϑΟʔϧυΛ௥Ճ͠·͢ɻ
  29. ԋश ಠࣗͷίϯςϯπΤϯςΟςΟλΠϓΛఆٛͯ͠ɺར༻ͯ͠ΈΑ͏ʂ 1. ίϯςϯπΤϯςΟςΟλΠϓͷఆٛ 2. entity_type.managerαʔϏεΛ࢖༻ͯ͠ɺ࡞੒ͨ͠ΤϯςΟςΟ λΠϓͷΤϯςΟςΟΛ࡞੒͢Δ 3. ΤϯςΟςΟ͕࡞੒͞Ε͍ͯΔ͔֬ೝ͢Δ ίʔυ͸ͪ͜Βˠ

    https://github.com/hmaruyama/my-drupal9-module/compare/vol8
  30. ࿅श໰୊

  31. ࿅श໰୊1 DrupalͷʮΤϯςΟςΟʯʹ͍ͭͯਖ਼͍͠هड़Λબ୒͍ͯͩ͘͠͞ɻ 1. ʮίϯςϯπʯ΋͘͠͸ʮߏ੒ʯͷɺӬଓతͳετϨʔδʹ࢖ ༻͞ΕΔΦϒδΣΫτɻ 2. αΠτͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷ৘ใΛѻ͏σʔλɻ 3. Drupalͷಈ࡞Λมߋ͢ΔPHPؔ਺ɻ 4.

    Doctrine ORMΛհͯ͠σʔλૢ࡞Ͱ͖Δɻ
  32. ࿅श໰୊1 DrupalͷʮΤϯςΟςΟʯʹ͍ͭͯਖ਼͍͠هड़Λબ୒͍ͯͩ͘͠͞ɻ 1. ʮίϯςϯπʯ΋͘͠͸ʮߏ੒ʯͷɺӬଓతͳετϨʔδʹ࢖ ༻͞ΕΔΦϒδΣΫτɻ 2. αΠτͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷ৘ใΛѻ͏σʔλɻ 3. Drupalͷಈ࡞Λมߋ͢ΔPHPؔ਺ɻ 4.

    Doctrine ORMΛհͯ͠σʔλૢ࡞Ͱ͖Δɻ
  33. ࿅श໰୊2 DrupalͷʮΤϯςΟςΟλΠϓʯʹ͍ͭͯਖ਼͍͠هड़Λબ୒͍ͯͩ͘͠͞ɻ 1. Plugin APIͰߏ੒͞Ε͍ͯΔɻ 2. ϑοΫͰΤϯςΟςΟλΠϓΛఆٛͰ͖Δɻ 3. ΤϯςΟςΟλΠϓʹ͸ඞͣόϯυϧΛ༻ҙ͢Δඞཁ͕͋Δɻ 4.

    ߏ଄Խ͞Εͨ୯ҰͷΞΠςϜɻ
  34. ࿅श໰୊2 DrupalͷʮΤϯςΟςΟλΠϓʯʹ͍ͭͯਖ਼͍͠هड़Λબ୒͍ͯͩ͘͠͞ɻ 1. Plugin APIͰߏ੒͞Ε͍ͯΔɻ 2. ϑοΫͰΤϯςΟςΟλΠϓΛఆٛͰ͖Δɻ 3. ΤϯςΟςΟλΠϓʹ͸ඞͣόϯυϧΛ༻ҙ͢Δඞཁ͕͋Δɻ 4.

    ߏ଄Խ͞Εͨ୯ҰͷΞΠςϜɻ
  35. ຊ೔ͷΞδΣϯμ͸ऴྃ

  36. ΞδΣϯμ 1. ΤϯςΟςΟͱ͸ 2. Entity APIͰΤϯςΟςΟΛૢ࡞͢Δ 3. طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔ 4. ಠࣗͷΤϯςΟςΟλΠϓΛ࡞੒͢Δ

    5. ࿅श໰୊
  37. None