Подпапки и как использовать пространство имён

11

В Drupal 7 у меня может быть модуль внутри другого модуля. Это все еще имеет место в Drupal 8 и как я мог бы классы пространства имен внутри подмодуля?

Еще одна вещь, которую я могу сделать в Drupal 7, - это создавать подпапки внутри папки модулей для группировки моих модулей.

Пример:

сайты
--- / все
--- / --- / модули
--- / --- / --- / Collection_Alpha
--- / --- / --- / --- / module_a
--- / - - / --- / --- / module_b
--- / --- / --- / Collection_Beta
--- / --- / --- / --- / module_x
--- / --- / --- / --- / module_y

Это все еще возможно в Drupal 8? Если да, то как мне нужно распределять пространства между моими классами, чтобы автозагрузчик мог разрешить его в правильной структуре папок?

Например: Drupal \ Collection_Alpha \ module_a \ myClass1?

dustinmoris
источник
2
Я почти уверен, что разрешение пространства имен будет зарегистрировано как "/ path / to / module / src", поэтому вам не нужно делать что-то другое для модулей 'sub'. т.е. основной модуль будет Drupal\my_moduleв «my_module / src», Drupal\my_submoduleсубмодуль будет в «my_module / modules / my_submodule / src» и т. д.
Clive
Спасибо, Клайв, это имеет смысл! Как насчет вложенных папок? Любая идея, если это все еще поддерживается и как это будет выглядеть с автозагрузкой класса?
пылинморис

Ответы:

7

@Clive правильно.

Пространство имен всегда Drupal\{module_name} . Где этот модуль живет, не имеет значения (если он где-то, где его может найти Drupal). Это пространство имен всегда указывает на $path_to_module/src.

Это не могло бы работать по-другому. На разных сайтах модули имеют разную структуру и разные места, но один и тот же код должен работать независимо от того, где.

Berdir
источник
Спасибо Клайв и Бердир! Наверное, у меня есть еще один вопрос: можно ли зарегистрировать дополнительное пространство имен, которое также указывает на папку модулей? например: DrupalModules \ {module_name}, чтобы указать на $ path_to_module / src? Я прошу, чтобы лучше понять, как спроектировать наши классы сегодня, чтобы иметь небольшие трения при переходе на D8 один день.
dustinmoris
1
Если классы специфичны для Drupal (т. Е. Вы не пишете отдельную библиотеку), возможно, было бы лучше сохранить их \Drupalдля согласованности. Но тем не менее интересный вопрос, я бы посоветовал вам задать его как отдельный вопрос. На самом деле, если вы этого не сделаете, я, вероятно, буду :)
Клайв
1
Вы, вероятно, могли бы, да, увидеть system_register () и drupal_classloader_register (). Эти вспомогательные функции жестко закодировали "Drupal \", но вы могли бы напрямую получить сервис class_loader. Но, как сказал @Clive, я бы не советовал делать это, на самом деле нет причин делать это, если только вы не используете внешнюю библиотеку.
Бердир
Кулио, это имеет смысл! Спасибо ребята! @Clive: Как вы и предлагали, я создал drupal.stackexchange.com/questions/142309/…
dustinmoris
Вы можете проверить модуль mongodb уже, чтобы увидеть структуру.
6

Пространства имен основаны на автозагрузке PSR-4, проверьте спецификацию http://www.php-fig.org/psr/psr-4 .

Если вы хотите субмодули, вы можете использовать следующую структуру папок. d8:

/modules
   my_module/
     src/
      Controller/
        A.php
     modules/
       my_sub_module/
         src/
          Controller/
            B.php

Пространство имен для "my_module":

Drupal\my_module\Controller\A

Пространство имен для "my_sub_module":

Drupal\my_sub_module\Controller\B

Посмотрите пространства имен PSR-4 и автозагрузку в Drupal 8 для получения дополнительной информации.

Dmouse
источник
Спасибо, дом. Первоначально я разместил свой вопрос на связанном ресурсе на Drupal.org, а теперь я отредактировал свой собственный вопрос, чтобы указать также на эту
ветку