Podfoldery i jak klas przestrzeni nazw

11

W Drupal 7 mogę mieć moduł wewnątrz innego modułu. Czy tak jest nadal w przypadku Drupala 8 i jak miałbym klas przestrzeni nazw wewnątrz podmodułu?

Inną rzeczą, którą mogę zrobić w Drupal 7, jest utworzenie podfolderów w folderze modułów, aby pogrupować moje moduły.

Przykład:

strony
--- / wszystkie
--- / --- / moduły
--- / --- / --- / Collection_Alpha
--- / --- / --- / --- / module_a
--- / - - / --- / --- / module_b
--- / --- / --- / Collection_Beta
--- / --- / --- / --- / module_x
--- / --- / --- / --- / module_y

Czy jest to nadal możliwe w Drupal 8? Jeśli tak, w jaki sposób musiałbym przestrzeni nazw moich klas, aby autoloader mógł rozwiązać to do właściwej struktury folderów?

np .: Drupal \ Collection_Alpha \ module_a \ myClass1?

dustinmoris
źródło
2
Jestem pewien, że rozdzielczość przestrzeni nazw zostanie zarejestrowana jako „/ path / to / module / src”, więc nie powinieneś robić nic innego dla modułów „podrzędnych”. tzn. moduł główny będzie Drupal\my_modulew „moim_module / src”, podmoduł będzie Drupal\my_submodulew „moim_module / modułów / moim_submodule / src” i tak dalej
Clive
Dzięki Clive, to ma sens! Co z podfolderami? Masz pomysł, czy nadal jest to obsługiwane i jak wyglądałoby to z automatycznym ładowaniem klasy?
dustinmoris

Odpowiedzi:

7

@Clive jest poprawny.

Przestrzeń nazw jest zawsze Drupal\{module_name} . To, gdzie mieszka ten moduł, nie ma znaczenia (o ile Drupal może go znaleźć). Ta przestrzeń nazw zawsze wskazuje $path_to_module/src.

Nie działałoby to w żaden inny sposób. Różne witryny mają moduły o innej strukturze i różnych miejscach, ale ten sam kod musi działać bez względu na to, gdzie.

Berdir
źródło
Dzięki Clive i Berdir! Chyba mam jeszcze jedno pytanie uzupełniające: Czy można zarejestrować dodatkową przestrzeń nazw, która również wskazuje folder modułów? np .: DrupalModules \ {nazwa_modułu}, aby wskazać $ ścieżka_do_modułu / src? Proszę o lepsze zrozumienie, w jaki sposób zaprojektować dziś nasze klasy, aby miały małe tarcie podczas przeprowadzki do D8 pewnego dnia.
dustinmoris,
1
Jeśli klasy są specyficzne dla Drupala (tzn. Nie piszesz samodzielnej biblioteki), lepiej byłoby zachować je pod kontrolą \Drupaldla zachowania spójności. Jednak interesujące pytanie, zachęcam do zadawania go jako osobnego pytania. W rzeczywistości, jeśli nie, prawdopodobnie będę :)
Clive
1
Prawdopodobnie mógłbyś zobaczyć system_register () i drupal_classloader_register (). Te funkcje pomocnicze mają kod stały „Drupal \”, ale można uzyskać bezpośrednio usługę class_loader. Ale jak powiedział @Clive, nie polecałbym tego robić, tak naprawdę nie ma powodu, aby to zrobić, chyba że dołączasz bibliotekę zewnętrzną.
Berdir
Coolio, to ma sens! Dzięki chłopaki! @Clive: Jak zasugerowałeś, stworzyłem drupal.stackexchange.com/questions/142309/…
dustinmoris
Możesz już sprawdzić moduł mongodb, aby zobaczyć strukturę.
6

Przestrzenie nazw oparte są na autoloadie PSR-4, sprawdź specyfikację http://www.php-fig.org/psr/psr-4 .

Jeśli chcesz podmoduły, możesz użyć następnej struktury folderów. d8:

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

Przestrzeń nazw dla „mojego_modułu”:

Drupal\my_module\Controller\A

Przestrzeń nazw dla „mojego_sub_modułu”:

Drupal\my_sub_module\Controller\B

Aby uzyskać więcej informacji, zobacz Przestrzenie nazw PSR-4 i automatyczne ładowanie w Drupal 8 .

dmouse
źródło
Dzięki dmouse. Początkowo zamieściłem moje pytanie w powiązanym zasobie na Drupal.org, a teraz zredagowałem własne pytanie, aby wskazać również ten wątek;)
dustinmoris