$30 off During Our Annual Pro Sale. View Details »

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

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

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

Other Decks in Programming

Transcript

  1. ୈ8ճ ΤϯςΟςΟ
    Drupal Ϟδϡʔϧ


    ։ൃೖ໳ߨ࠲

    View Slide

  2. Drupal Ϟδϡʔϧ։ൃೖ໳ߨ࠲γϦʔζ
    – DrupalͰ͸ʮϞδϡʔϧʯͱݺ͹ΕΔɺখ͞ͳιϑτ΢ΣΞΛ࣮૷͢Δ͜ͱͰػೳ֦ுΛߦ
    ͍·͢ɻຊ΢ΣϏφʔγϦʔζͰ͸ɺDrupalͷϞδϡʔϧ։ൃʹؔ͢Δجૅ஌ࣝΛղઆ͠·
    ͢ɻ
    – DrupalͷόοΫΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗ෼ͰΧελϜϞδϡʔϧΛ࡞Ε
    ΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛ໨ࢦ͢ํʹ͓͢͢ΊͰ͢ɻ
    – DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛର৅ͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ͍
    ํ͸ɺॳ৺ऀ޲͚DrupalνϡʔτϦΞϧಈըʢ೔ຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ·Γ
    ·͢ɻ

    View Slide

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

    View Slide

  4. ΤϯςΟςΟͱ͸

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. ΤϯςΟςΟͱ͸
    – ʮίϯςϯπʯ΋͘͠͸ʮߏ੒ʯͷɺӬଓతͳετϨʔδʹ࢖
    ༻͞ΕΔΦϒδΣΫτͰ͢ɻ
    – DrupalͰσʔλΛѻ͏ํ๏ͷҰͭͰ͋Γɺσʔλ΍ίϯςϯπ
    ͷϞσϦϯάΛߦ͍·͢ɻ
    – ΤϯςΟςΟΛάϧʔϐϯά͢ΔΤϯςΟςΟλΠϓ͸ɺ
    DrupalͷϓϥάΠϯγεςϜʹΑͬͯఆٛ͞Ε·͢ɻ

    View Slide

  9. ΤϯςΟςΟγεςϜʹొ৔͢Δ༻ޠ
    – ΤϯςΟςΟɿߏ଄Խ͞Εͨ୯ҰͷΞΠςϜʢΠϯελϯεʣɻ

    ྫɿ1ͭͷهࣄɺ1ͭͷϢʔβʔ


    – ΤϯςΟςΟλΠϓɿΤϯςΟςΟΛάϧʔϐϯάͨ͠΋ͷɻΤϯςΟςΟλΠϓ͸
    EntityTypeManagerʹΑͬͯఆٛ͞ΕΔϓϥάΠϯλΠϓͷϓϥάΠϯɻ

    ྫɿίϯςϯπ(ϊʔυ)ɺλΫιϊϛʔ


    – όϯυϧɿαϒλΠϓͱ΋ݺ͹ΕΔɻΤϯςΟςΟλΠϓΛࡉ෼Խͨ͠΋ͷɻόϯυ
    ϧΛ༻ҙ͢Δ͔͸೚ҙɻ௨ৗɺόϯυϧ͸ߏ੒ΤϯςΟςΟʹΑͬͯఆٛ͞ΕΔɻ

    ྫɿهࣄίϯςϯπλΠϓɺλά

    View Slide

  10. ΤϯςΟςΟͷ֊૚
    ΤϯςΟςΟλΠϓ όϯυϧ ΤϯςΟςΟ
    ίϯςϯπʢϊʔυʣ
    هࣄίϯςϯπλΠϓ
    هࣄ1
    هࣄ2
    جຊϖʔδίϯςϯπ
    λΠϓ
    جຊϖʔδ1
    λΫιϊϛʔλʔϜ λά
    λά1
    λά2
    Ϣʔβʔ ʢແ͠ʣ
    ؅ཧऀ1
    ಗ໊Ϣʔβʔ1

    View Slide

  11. – ߏ੒ΤϯςΟςΟɿαΠτͷߏ੒Մೳͳઃఆͷ৘ใΛѻ͏Φϒ
    δΣΫτͰ͢ɻߏ੒γεςϜͰ࢖༻͞Ε·͢ɻ຋༁Λαϙʔτ͠
    ͍ͯ·͢ɻϞδϡʔϧͷΠϯετʔϧ࣌ʹಠࣗͷσϑΥϧτઃఆ
    ΛఏڙͰ͖·͢ɻ
    – ίϯςϯπΤϯςΟςΟɿઃఆՄೳͳϑΟʔϧυͱجຊϑΟʔϧ
    υͰߏ੒͞Ε·͢ɻϦϏδϣϯ΍຋༁Λαϙʔτ͍ͯ͠·͢ɻ
    ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟ

    View Slide

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

    View Slide

  13. ΤϯςΟςΟλΠϓ ΤϯςΟςΟ
    ίϯςϯπʢϊʔυʣ
    هࣄ1
    هࣄ2
    جຊϖʔδ1
    λΫιϊϛʔλʔϜ
    λά1
    λά2
    Ϣʔβʔ
    ؅ཧऀ1
    ಗ໊Ϣʔβʔ1
    ίϯςϯπλΠϓ
    هࣄίϯςϯπλΠϓ
    جຊϖʔδίϯςϯπλΠϓ
    ϘΩϟϒϥϦ λά
    ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷݟ෼͚ํ
    ߏ੒


    ΤϯςΟςΟ
    ۩ମతʹ͸ɺΤϯςΟςΟ
    λΠϓΛఆٛ͢ΔΫϥεͷ
    ΞϊςʔγϣϯΛݟͯ൑ผ
    Ͱ͖Δ
    @ContentEntityTyp
    e

    o
    r

    @ConfigEntityType
    ίϯςϯπ


    ΤϯςΟςΟ

    View Slide

  14. ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷҧ͍
    ΤϯςΟςΟλΠϓͷఆٛ ΤϯςΟςΟͷྫ σʔλͷ֨ೲ৔ॴ(DB)
    ߏ੒

    ΤϯςΟςΟ
    ConfigEntityBaseΛ֦ுͨ͠
    Ϋϥε
    ● ը૾ελΠϧ
    ● Ϣʔβʔ໾ׂ
    ● ίϯςϯπλΠϓ
    શͯ config ςʔϒϧʹߦͱ
    ͯ֨͠ೲ͞Ε·͢ɻ
    ίϯςϯπ

    ΤϯςΟςΟ
    ContentEntityBaseΛ֦ுͨ͠
    Ϋϥε
    ● ϊʔυ
    ● λΫιϊϛʔλʔ
    Ϝ
    ● ίϝϯτ
    ● Ϣʔβʔ
    ίϯςϯπΤϯςΟςΟλ
    Πϓ͝ͱʹςʔϒϧ͕༻ҙ
    ͞Εɺ֤ΤϯςΟςΟ͸ߦ
    ͱͯ֨͠ೲ͞Ε·͢ɻ

    View Slide

  15. ΤϯςΟςΟͱ͸ ·ͱΊ
    – ΤϯςΟςΟ͸ɺʮίϯςϯπʯ΋͘͠͸ʮߏ੒ʯͷɺӬଓతͳε
    τϨʔδʹ࢖༻͞ΕΔΦϒδΣΫτͰ͢ɻ
    – DrupalͰσʔλΛѻ͏ํ๏ͷҰͭͰ͋Γɺσʔλ΍ίϯςϯπͷϞ
    σϦϯάΛߦ͍·͢ɻ
    – ΤϯςΟςΟ͸ΤϯςΟςΟλΠϓʹΑͬͯɺ৔߹ʹΑͬͯ͸͞Β
    ʹόϯυϧʹΑͬͯࡉ෼Խ͞Ε·͢ɻ
    – ΤϯςΟςΟʹ͸ߏ੒ΤϯςΟςΟͱίϯςϯπΤϯςΟςΟͷ2छ
    ྨ͕ଘࡏ͠·͢ɻ

    View Slide

  16. Entity APIͰΤϯςΟςΟΛૢ࡞͢Δ

    View Slide

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

    View Slide

  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

    View Slide

  19. – ΤϯςΟςΟͷ࡞੒






    – ΤϯςΟςΟͷ࡟আ
    ΤϯςΟςΟͷओͳૢ࡞
    $newNode = \Drupal::entityTypeManager()->getStorage('node')->create([


    'type' => 'article',


    'title' => 'Entity APIͰ࡞੒ͨ͠هࣄ',


    ]);


    $newNode->save();
    $newNode->delete();

    View Slide

  20. ԋश
    entity_type.managerαʔϏεΛ࢖ͬͯΤϯςΟςΟΛૢ࡞ͯ͠ΈΑ
    ͏ʂ
    1. ΤϯςΟςΟͷಡΈࠐΈ
    2. ΤϯςΟςΟ͕࣋ͭ஋ͷऔಘ
    3. ΤϯςΟςΟͷ࡞੒
    4. ΤϯςΟςΟͷ࡟আ
    ίʔυ͸ͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol8

    View Slide

  21. طଘͷΤϯςΟςΟλΠϓΛݟ͚ͭΔ

    View Slide

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

    – ίϯτϦϏϡʔτϞδϡʔϧ
    – ΧελϜϞδϡʔϧ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. ΧελϜϞδϡʔϧͰಠࣗͷίϯςϯπΤϯςΟςΟλΠ
    ϓΛ࡞੒͢Δํ๏
    ࠓճ͸ྫͱͯ͠ɺίϯςϯπΤϯςΟςΟλΠϓΛఆٛ͢Δํ๏Λ঺հ͠·͢ɻ
    1. ίϯςϯπΤϯςΟςΟλΠϓΛఆٛ͢ΔΫϥεΛ༻ҙ͠·͢ɻ
    a. src/EntityσΟϨΫτϦ಺ʹΫϥεϑΝΠϧΛ࡞੒͠·͢ɻ
    b. ContentEntityBaseΛ֦ுɺContentEntityInterfaceΛ࣮૷ͨ͠ΫϥεΛ
    ఆٛ͠·͢ɻ
    c. ΞϊςʔγϣϯͰϝλσʔλΛهड़͠·͢ɻ
    d. baseFieldDefinitionsؔ਺ͰجຊϑΟʔϧυΛ௥Ճ͠·͢ɻ

    View Slide

  29. ԋश
    ಠࣗͷίϯςϯπΤϯςΟςΟλΠϓΛఆٛͯ͠ɺར༻ͯ͠ΈΑ͏ʂ
    1. ίϯςϯπΤϯςΟςΟλΠϓͷఆٛ
    2. entity_type.managerαʔϏεΛ࢖༻ͯ͠ɺ࡞੒ͨ͠ΤϯςΟςΟ
    λΠϓͷΤϯςΟςΟΛ࡞੒͢Δ
    3. ΤϯςΟςΟ͕࡞੒͞Ε͍ͯΔ͔֬ೝ͢Δ
    ίʔυ͸ͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol8

    View Slide

  30. ࿅श໰୊

    View Slide

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

    View Slide

  32. ࿅श໰୊1
    DrupalͷʮΤϯςΟςΟʯʹ͍ͭͯਖ਼͍͠هड़Λબ୒͍ͯͩ͘͠͞ɻ
    1. ʮίϯςϯπʯ΋͘͠͸ʮߏ੒ʯͷɺӬଓతͳετϨʔδʹ࢖
    ༻͞ΕΔΦϒδΣΫτɻ


    2. αΠτͷݱࡏͷঢ়ଶʹؔ͢ΔҰ࣌తͳੑ࣭ͷ৘ใΛѻ͏σʔλɻ
    3. Drupalͷಈ࡞Λมߋ͢ΔPHPؔ਺ɻ
    4. Doctrine ORMΛհͯ͠σʔλૢ࡞Ͱ͖Δɻ

    View Slide

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

    View Slide

  34. ࿅श໰୊2
    DrupalͷʮΤϯςΟςΟλΠϓʯʹ͍ͭͯਖ਼͍͠هड़Λબ୒͍ͯͩ͘͠͞ɻ
    1. Plugin APIͰߏ੒͞Ε͍ͯΔɻ


    2. ϑοΫͰΤϯςΟςΟλΠϓΛఆٛͰ͖Δɻ
    3. ΤϯςΟςΟλΠϓʹ͸ඞͣόϯυϧΛ༻ҙ͢Δඞཁ͕͋Δɻ
    4. ߏ଄Խ͞Εͨ୯ҰͷΞΠςϜɻ

    View Slide

  35. ຊ೔ͷΞδΣϯμ͸ऴྃ

    View Slide

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

    View Slide

  37. View Slide