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

Drupal モジュール開発入門講座 第2回 シンプルなカスタムモジュールを作ってみよう

Drupal モジュール開発入門講座 第2回 シンプルなカスタムモジュールを作ってみよう

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

Other Decks in Programming

Transcript

  1. Drupal Ϟδϡʔϧ ։ൃೖ໳ߨ࠲ ୈ2ճ γϯϓϧͳΧελϜ 
 ϞδϡʔϧΛ࡞ͬͯΈΑ͏

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

    DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛର৅ͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ ͍ํ͸ɺॳ৺ऀ޲͚DrupalνϡʔτϦΞϧಈըʢ೔ຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ ·Γ·͢ɻ
  3. ΞδΣϯμ 1. ΧελϜϞδϡʔϧΛ࡞Ζ͏ 2. *.info.ymlϑΝΠϧͷ࡞੒ 3. ϑοΫΛ࣮૷ 4. ϧʔςΟϯάͱίϯτϩʔϥʔΛ௥Ճ 5.

    ϑΥʔϜΛ࡞੒ 6. ϒϩοΫΛ࡞੒ 7. ࿅श໰୊
  4. ΧελϜϞδϡʔϧΛ࡞Ζ͏

  5. DrupalΛ֦ு͢Δํ๏ ϞδϡʔϧʹΑͬͯDrupalΛมߋɾ֦ு͢Δ͢Δํ๏͸༷ʑ༻ҙ͞Ε͓ͯ Γɺ΍Γ͍ͨ͜ͱʹΑͬͯΞϓϩʔν͕ҟͳΓ·͢ɻ – ϑοΫ – ϓϥάΠϯ – ΤϯςΟςΟ –

    αʔϏε – ϧʔςΟϯά – Πϕϯτ
  6. खॱ 1. *.info.ymlͷ࡞੒ 2. ϑοΫΛ࣮૷ 3. ϧʔςΟϯάͱίϯτϩʔϥʔΛ௥Ճ 4. ϑΥʔϜΛ࡞੒ 5.

    ϒϩοΫΛ࡞੒ ΧελϜϞδϡʔϧͷ࡞੒εςοϓ Drupal͕ϞδϡʔϧΛͲͷΑ͏ʹѻ͏͔Λֶश͢ΔͨΊʹɺΧελϜϞδϡʔϧΛ࡞੒͢ΔҰͭͷྫΛ঺ հ͠·͢ɻ υΩϡϝϯτϧʔτ௚Լʹɺmodules/custom/marucha/ ͱ͍͏σΟϨΫτϦΛ࡞੒͠ɺ͜͜ͰΧελϜϞ δϡʔϧͷ࡞੒Λߦ͍ͬͯ͘͜ͱͱ͠·͢ɻ ιʔείʔυ͸ͪ͜Β→ https://github.com/hmaruyama/my-drupal9-module/compare/master...vol2
  7. *.info.ymlϑΝΠϧͷ࡞੒

  8. – Ϟδϡʔϧͷ໊લ΍આ໌ͳͲɺϞδϡʔϧʹؔ͢Δϝλ৘ใΛهड़͢ΔͨΊͷϑΝΠϧͰ ͢ɻ – Ϟδϡʔϧ࡞੒ʹ͓͍ͯɺ།ҰͷඞਢϑΝΠϧͰ͢ɻ – ͜ͷϑΝΠϧ͑͋͞Ε͹ɺDrupal͸ΧελϜϞδϡʔϧΛద੾ͳϞδϡʔϧͱͯ͠ೝࣝͰ ͖·͢ɻ – YMLܗࣜͷϑΝΠϧͳͷͰɺΠϯσϯτ͸λϒͰͳ͘εϖʔε2ͭͰߦ͏ඞཁ͕͋Γ·͢ɻ

    *.info.ymlϑΝΠϧͱ͸ your Drupal project root └── web (document root) └── modules └── custom └── marucha └── marucha.info.yml
  9. marucha.info.ymlΛ࡞੒͠Α͏ name: Marucha type: module description: 'This is the first

    custom module.' core_version_requirement: ^8 || ^9 ඞਢ Ϟδϡʔϧͷϥϕϧ໊ ඞਢ ֦ுػೳͷछผΛࣔ͢ ೚ҙ Ϟδϡʔϧͷઆ໌Λࣔ͢ ඞਢ ରԠ͢ΔίΞόʔδϣϯ
  10. ࢀߟ) *.info.ymlϑΝΠϧͰఆٛՄೳͳKey-ValueϖΞ https://www.drupal.org/docs/creating- modules/let-drupal-know-about-your- module-with-an-infoyml-file

  11. ΧελϜϞδϡʔϧΛ༗ޮԽ͢Δ – *.info.ymlϑΝΠϧΛద੾ʹ༻ҙ͢Δ͚ͩͰɺDrupal͸ϞδϡʔϧΛೝࣝͯ͘͠Ε·͢ɻ – Drupal؅ཧϝχϡʔ > ػೳ֦ு ͷϞδϡʔϧҰཡͷதʹʮMarucha Moduleʯ͕දࣔ͞Ε͍ͯΔ͔֬ೝ͠ ·͢ɻ

    – νΣοΫϘοΫεʹνΣοΫΛೖΕͯɺʮΠϯετʔϧʯϘλϯΛΫϦοΫ͠·͢ɻ *.info.ymlϑΝΠϧͷΈͷঢ়ଶͩ ͕ɺσΟϨΫτϦͱϑΝΠϧΛ ਖ਼͘͠഑ஔ͢Δ͜ͱͰϞδϡʔ ϧͱͯ͠ೝࣝ͞ΕΔʂ
  12. ԋश *.info.ymlϑΝΠϧΛ࡞੒ͯ͠ɺϞδϡʔϧΛ༗ޮԽ͠Α͏ʂ 1. ΧελϜϞδϡʔϧͷσΟϨΫτϦ௚Լʹ 
 marucha.info.ymlϑΝΠϧΛ࡞੒͢Δ 2. Drupalͷ؅ཧը໘ͷ ػೳ֦ு ϖʔδʹҠಈͯ͠

    
 ΧελϜϞδϡʔϧΛ༗ޮԽ͢Δ
  13. ϑοΫΛ࣮૷

  14. ϑοΫͰطଘͷϑΥʔϜΛॻ͖׵͑Α͏

  15. ϑοΫͱ͸ʁ – ϑοΫ(Hooks)ͱ͸ɺDrupalͷಈ࡞Λมߋ͢Δؔ਺Ͱ͢ɻ – ϑοΫΛ࢖༻͢Δ͜ͱͰɺطଘͷίʔυΛॻ͖׵͑Δ͜ͱͳ͘ɺDrupalίΞ΍ଞϞ δϡʔϧͷಈ࡞Λมߋɾ֦ுͰ͖·͢ɻ – ֤ϑοΫ͸ hook_batch_alter() ͷΑ͏ʹ

    hook_ Ͱ࢝·Δ໊લ͕͚ͭΒΕ͍ͯ·͢ɻ – ֤ϑοΫʹ͸ɺఆٛࡁΈͷҰ࿈ͷύϥϝʔλʔͱɺఆٛࡁΈͷ໭Γ஋͕༻ҙ͞Εͯ ͍·͢ɻ – جຊతʹ͸ɺΧελϜϞδϡʔϧͷ *.moduleϑΝΠϧͰϑοΫΛ࣮૷͠·͢ɻ – ΧελϜϞδϡʔϧͰΦϦδφϧͷϑοΫΛఏڙ͢Δ͜ͱ΋ՄೳͰ͢ɻ 
 https://www.drupal.org/docs/creating-custom- modules/understanding-hooks
  16. DrupalίΞͰ༻ҙ͞Ε͍ͯΔϑοΫؔ਺Ұཡ ૯਺ɿ286ݸ ʢDrupal 9.4.x࣌఺ʣ https://api.drupal.org/api/ drupal/core%21core.api.php/ group/hooks/9.4.x

  17. ԋश ϑοΫΛ࣮૷ͯ͠ɺطଘͷϑΥʔϜΛॻ͖׵͑Α͏ʂ 1. ΧελϜϞδϡʔϧͷσΟϨΫτϦ௚Լʹ 
 marucha.moduleϑΝΠϧΛ࡞੒͢Δ 2. ར༻(࣮૷)͍ͨ͠ϑοΫΛυΩϡϝϯτ͔Β୳ͯ͠ɺϑοΫͷίʔυΛ ίϐʔͯ͠marucha.moduleϑΝΠϧʹϖʔετ͢Δ 3.

    ؔ਺໊ͷ hook_ ෦෼Λ marucha_ (ϞδϡʔϧͷϚγϯ໊)ʹॻ͖׵͑Δ 4. ؔ਺಺Ͱ࣮ߦ͢ΔॲཧΛهड़͢Δ
  18. ϧʔςΟϯάͱίϯτϩʔϥʔΛ௥Ճ

  19. ಠࣗͷϖʔδΛ௥Ճ͠Α͏

  20. Drupalͷϖʔδίʔϧϓϩηε https://www.drupal.org/docs/drupal-apis/ routing-system/routing-system-overview ᶃ શͯͷϦΫΤετ͸ index.php(ϑϩϯτί ϯτϩʔϥʔ)Λ௨Δ ᶄ index.phpͰɺSymfonyͷ HTTPKernelΛجͱͨ͠

    DrupalKernel͕࣮ߦ͞ΕΔ ᶅ ϦΫΤετͷϧʔτΛಛ ఆ͠ɺίϯτϩʔϥʔΛ࣮ ߦɺςϯϓϨʔτͷϨϯμϦ ϯά͕ߦΘΕΔ ᶆ ίϯτϩʔϥʔͷॲཧ݁ ՌΛHTTPϨεϙϯεͱͯ͠ ฦ٫͢Δ
  21. DrupalͷϧʔςΟϯάγεςϜ – ϧʔςΟϯά͸ɺDrupal͕ड͚औͬͨϦΫΤετʹରͯ͠ɺͲͷίϯ τϩʔϥʔʗΞΫγϣϯΛ࣮ߦ͢Δ͔ΛϚοϐϯά͢Δ΋ͷͰ͢ɻ – Ϟδϡʔϧͷ *.routing.yml ϑΝΠϧͰϧʔςΟϯάΛఆٛͰ͖·͢ɻ ͜Ε͕ϧʔςΟϯάΛఆٛ͢Δ࠷΋؆୯ͳํ๏Ͱ͢ɻ –

    ଞʹ΋ɺPHPίʔυͰطଘϧʔτΛมߋ͢Δ͜ͱ΋Ͱ͖·͢ɻ
  22. DevelϞδϡʔϧͰɺαΠτʹొ࿥ ͞Ε͍ͯΔશͯͷϧʔτҰཡΛऔಘ Ͱ͖·͢ɻ /devel/routes DrupalαΠτͷϧʔτҰཡ

  23. ϧʔςΟϯάͷએݴ Ϟδϡʔϧͷ *.routing.yml ϑΝΠϧͰϧʔςΟϯάΛఆٛͰ͖·͢ɻ marucha.page: path: '/marucha' defaults: _controller: '\Drupal\marucha\Controller\MaruchaController::index'

    _title: 'Marucha First Page' requirements: _permission: 'access content' https://www.drupal.org/docs/drupal-apis/routing-system/introductory-drupal-routes- and-controllers-example#s-routing-in-routingyml-files
  24. ίϯτϩʔϥʔͷ௥Ճ *.routing.yml ϑΝΠϧͷ _controller Ωʔ ʹ͸ɺ࣍ͷ஋Λࢦఆ͍ͯ͠·ͨ͠ɻ '\Drupal\marucha\Controller\MaruchaCon troller::index' 
 


    ϧʔςΟϯάͰએݴ໊ͨ͠લͱҰக͢Δ Α͏ʹɺίϯτϩʔϥʔΫϥεΛ༻ҙ͠ ͯΞΫγϣϯϝιουΛ࣮૷͠·͢ɻ <?php namespace Drupal\marucha\Controller; use Drupal\Core\Controller\ControllerBase; /** * Provides route responses for marucha module. */ class MaruchaController extends ControllerBase { /** * Returns a simple page. * * @return array * A simple renderable array. */ public function index() { return ['#markup' => 'Hello world!']; } } src/Controller/MaruchaController.php https://www.drupal.org/docs/drupal-apis/routing-system/introductory-drupal- routes-and-controllers-example#s-building-a-page-controller
  25. ԋश ϧʔςΟϯάͱίϯτϩʔϥʔΛ௥Ճͯ͠ɺಠࣗͷϖʔδΛ࡞੒͠Α͏ʂ 1. ϞδϡʔϧͷσΟϨΫτϦ௚Լʹ 
 marucha.routing.yml ϑΝΠϧΛ࡞੒͢Δ 2. ϑΝΠϧ಺ʹϧʔςΟϯάΛઃఆ͢Δ 3.

    ϞδϡʔϧσΟϨΫτϦ௚Լʹ 
 src/Controller/MaruchaController.php ϑΝΠϧΛ࡞੒͢Δ 4. ΞΫγϣϯϝιουΛ࣮૷͢Δ
  26. ϑΥʔϜΛ࡞੒

  27. Form APIͰϑΥʔϜΛ࡞੒͠Α͏

  28. DrupalͷForm API – DrupalͷForm API͸ɺHTMLϑΥʔϜΛૢ࡞͢ΔͨΊͷந৅ԽϨΠϠͰ͢ɻ – ϑΥʔϜͷఆٛɺදࣔɺݕূɺૹ৴ɺͱ͍͏ϥΠϑαΠΫϧΛ੍ޚ͠·͢ɻ – \Drupal\Core\Form\FormInterfaceΛ࣮૷ͯ͠ϑΥʔϜΫϥεΛ࡞੒͢Δ͜ͱͰɺΧελ ϜϞδϡʔϧͰϑΥʔϜΛ੍ޚͰ͖·͢ɻ

    – ϑΥʔϜ͕ཁٻ͞ΕΔͱɺϑΥʔϜ͸ϨϯμϦϯάՄೳͳ$form഑ྻͱͯ͠ఆٛ͞Ε· ͢ɻ – $form഑ྻ͸ϨϯμϦϯάͷաఔͰHTMLʹม׵͞ΕɺΤϯυϢʔβʔʹදࣔ͞Ε·͢ɻ https://www.drupal.org/docs/drupal-apis/form- api/introduction-to-form-api
  29. – Form API͸ɺ\Drupal\Core\Form\FormInterfaceΛ࣮૷ͨ͠جఈΫϥεΛ ఏڙ͍ͯ͠·͢ɻ͜Ε͸ϑΥʔϜͷ։࢝஍఺ͱ֦ͯ͠ுͰ͖·͢ɻ – FormBaseɿ࠷΋ҰൠతͳϑΥʔϜ – ConfigFormBaseɿ؅ཧऀ͕ϞδϡʔϧͷઃఆΛߋ৽Ͱ͖Δઃఆ ϑΥʔϜ –

    ConfirmFormBaseɿ֬ೝखॱΛఏڙ͢Δɺίϯςϯπ·ͨ͸ઃఆ Λ࡟আ͢ΔͨΊͷϑΥʔϜ ϑΥʔϜͷछྨ
  30. ϑΥʔϜΫϥεΛ࡞੒͢Δ <?php namespace Drupal\marucha\Form; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; class MaruchaForm

    extends FormBase { public function getFormId() { /** ϑΥʔϜΛࣝผ͢ΔͨΊͷIDΛฦ٫͢Δ */ } public function buildForm(array $form, FormStateInterface $form_state) { /** ϑΥʔϜΛߏ੒͢Δ֤ཁૉΛఆٛ͢Δ$form഑ྻΛฦ٫͢Δ */ } public function submitForm(array &$form, FormStateInterface $form_state) { /** ϑΥʔϜͷૹ৴΍ϑΥʔϜσʔλͷॲཧΛߦ͏ */ } } ϑΥʔϜΫϥε͸ • getFormID() • buildForm() • submitForm() ͷ3ͭͷϝιου͕ඞཁ src/Form/MaruchaForm.php ࡞੒ͨ͠ϑΥʔϜ͸ 
 • ϧʔςΟϯάʹొ࿥ͯ͠ϖʔδ ͱͯ͠දࣔͨ͠Γ • FormBuilderαʔϏεΛར༻ͯ͠ ϒϩοΫ౳Ͱදࣔͨ͠Γ 
 ͢Δ͜ͱ͕Ͱ͖Δ
  31. ԋश Form APIΛར༻ͯ͠ಠࣗͷϑΥʔϜΛ࡞੒͠Α͏ʂ 1. ϞδϡʔϧͷσΟϨΫτϦ௚Լʹ 
 src/Form/MaruchaForm.php ϑΝΠϧΛ࡞੒͢Δ 2. ඞཁͳϝιουΛ࣮૷͢Δ

    3. marucha.routing.ymlϑΝΠϧ಺ʹϧʔςΟϯάΛઃఆ͢Δ
  32. ϒϩοΫΛ࡞੒

  33. Block APIͰϒϩοΫΛ࡞੒͠Α͏

  34. – Block API͸ɺ࣮ࡍʹ͸2ͭͷAPIͰߏ੒͞Ε͍ͯ·͢ɻ – Plugin APIɿϒϩοΫͷίϯςϯπΛϨϯμϦϯά – Entity APIɿϒϩοΫͷ഑ஔ৘ใ΍ϒϩοΫݻ༗ͷߏ੒Λอଘ –

    \Drupal\Core\Block\BlockPluginInterfaceΛ࣮૷͢ΔϒϩοΫΫϥεΛ࡞੒ͯ͠ɺϒϩοΫΛఆٛ Ͱ͖·͢ɻ – Ͱ͕͢ɺ௨ৗ͸BlockPluginInterfaceͰ͸ͳ͘\Drupal\Core\Block\BlockBaseΫϥεΛ֦ுͯ͠Ϋ ϥεΛ࡞੒͠·͢ɻ – ͜Ε͸ɺϒϩοΫߏ੒ΤϯςΟςΟͰߏ੒Λऔಘɾઃఆ͢ΔͨΊͷڞ௨ͷߏ੒ϑΥʔϜͱ ϢʔςΟϦςΟϝιουΛఏڙ͢ΔΫϥεͰ͢ɻ Block APIͱ͸
  35. ϒϩοΫΫϥεΛ࡞੒͢Δ <?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() ϝιουͰ ϨϯμϦϯά഑ྻ Λฦ٫͢Δ
  36. ԋश Block APIΛར༻ͯ͠ಠࣗͷϒϩοΫΛ࡞੒͠Α͏ʂ 1. ϞδϡʔϧͷσΟϨΫτϦ௚Լʹ 
 src/Plugin/Block/MaruchaBlock.php ϑΝΠϧΛ࡞੒͢Δ 2. ΞϊςʔγϣϯͰϒϩοΫΛఆٛ͢Δ

    3. ඞཁͳϝιουΛ࣮૷͢Δ 4. Drupal؅ཧը໘͔Β ϒϩοΫϨΠΞ΢τ ʹҠಈͯ͠ 
 ೚ҙͷϦʔδϣϯʹ࡞੒ͨ͠ϒϩοΫΛ഑ஔ͢Δ
  37. ࿅श໰୊

  38. ࿅श໰୊1 *.info.ymlͰඞͣࢦఆ͢Δඞཁͷ͋Δ஋Λ͔࣍Β2ͭબ୒͍ͯͩ͘͠͞ɻ 1. name 2. description 3. package 4. type

    5. configure
  39. ࿅श໰୊1 *.info.ymlͰඞͣࢦఆ͢Δඞཁͷ͋Δ஋Λ͔࣍Β2ͭબ୒͍ͯͩ͘͠͞ɻ 1. name 2. description 3. package 4. type

    5. configure
  40. ࿅श໰୊2 FormBaseΫϥεΛ֦ு͢ΔϑΥʔϜΫϥεʹඞཁͳϝιου͸࣍ͷ͏ͪͲ ΕͰ͔͢ʁ͔࣍Β3ͭબ୒͍ͯͩ͘͠͞ɻ 1. getFormID() 2. buildForm() 3. validateForm() 4.

    saveForm() 5. submitForm()
  41. ࿅श໰୊2 FormBaseΫϥεΛ֦ு͢ΔϑΥʔϜΫϥεʹඞཁͳϝιου͸࣍ͷ͏ͪͲ ΕͰ͔͢ʁ͔࣍Β3ͭબ୒͍ͯͩ͘͠͞ɻ 1. getFormID() 2. buildForm() 3. validateForm() 4.

    saveForm() 5. submitForm()
  42. ࿅श໰୊3 ϧʔςΟϯάͷఆٛ͸Ͳ͜Ͱߦ͏͜ͱ͕Ͱ͖·͔͢ʁ 1. routes.xml Ͱߦ͏ɻ 2. routes.yml Ͱߦ͏ɻ 3. *.routing.yml

    Ͱߦ͏ɻ 4. ίϯτϩʔϥʔΫϥεͷΞϊςʔγϣϯͰߦ͏ɻ
  43. ࿅श໰୊3 ϧʔςΟϯάͷఆٛ͸Ͳ͜Ͱߦ͏͜ͱ͕Ͱ͖·͔͢ʁ 1. routes.xml Ͱߦ͏ɻ 2. routes.yml Ͱߦ͏ɻ 3. *.routing.yml

    Ͱߦ͏ɻ 4. ίϯτϩʔϥʔΫϥεͷΞϊςʔγϣϯͰߦ͏ɻ
  44. ࿅श໰୊4 ϧʔςΟϯάͷઃఆʹ͓͍ͯɺඞਢͷΩʔ͸࣍ͷ͏ͪͲΕͰ͔͢ʁ͔࣍Β3 ͭબ୒͍ͯͩ͘͠͞ɻ 1. defaults 2. path 3. methods 4.

    requirements 5. options
  45. ࿅श໰୊4 ϧʔςΟϯάͷઃఆʹ͓͍ͯɺඞਢͷΩʔ͸࣍ͷ͏ͪͲΕͰ͔͢ʁ͔࣍ Β3ͭબ୒͍ͯͩ͘͠͞ɻ 1. defaults 2. path 3. methods 4.

    requirements 5. options
  46. ࿅श໰୊5 ΧελϜϞδϡʔϧ࡞੒ʹ͓͍ͯɺ࠷௿ݶඞཁͳϑΝΠϧ͸ͲΕͰ͢ ͔ʁ 1. *.info.yml 2. *.module 3. *.services.yml 4.

    src/Controller/*.php 5. README.md
  47. ࿅श໰୊5 ΧελϜϞδϡʔϧ࡞੒ʹ͓͍ͯɺ࠷௿ݶඞཁͳϑΝΠϧ͸ͲΕͰ͢ ͔ʁ 1. *.info.yml 2. *.module 3. *.services.yml 4.

    src/Controller/*.php 5. README.md
  48. ຊ೔ͷΞδΣϯμ͸ऴྃ

  49. ΞδΣϯμ 1. ΧελϜϞδϡʔϧΛ࡞Ζ͏ 2. *.info.ymlϑΝΠϧͷ࡞੒ 3. ϑοΫΛ࣮૷ 4. ϧʔςΟϯάͱίϯτϩʔϥʔΛ௥Ճ 5.

    ϑΥʔϜΛ࡞੒ 6. ϒϩοΫΛ࡞੒ 7. ࿅श໰୊
  50. None