Unterordner und wie man Namespace-Klassen erstellt

11

In Drupal 7 kann ich ein Modul in einem anderen Modul haben. Ist dies in Drupal 8 immer noch der Fall und wie würde ich Namespace-Klassen innerhalb des Submoduls verwenden?

In Drupal 7 kann ich auch Unterordner im Ordner modules erstellen, um meine Module zu gruppieren.

Beispiel:

sites
--- / all
--- / --- / modules
--- / --- / --- / Collection_Alpha
--- / --- / --- / --- / module_a
--- / - - / --- / --- / module_b
--- / --- / --- / Collection_Beta
--- / --- / --- / --- / module_x
--- / --- / --- / --- / module_y

Ist das in Drupal 8 noch möglich? Wenn ja, wie müsste ich meinen Klassen einen Namespace zuweisen, damit der Autoloader ihn in die richtige Ordnerstruktur auflösen kann?

zB: Drupal \ Collection_Alpha \ module_a \ myClass1?

Dustinmoris
quelle
2
Ich bin mir ziemlich sicher, dass die Namespace-Auflösung als "/ path / to / module / src" registriert wird, daher sollten Sie für die "sub" -Module keine anderen Schritte ausführen müssen. dh das Hauptmodul befindet sich Drupal\my_modulein 'my_module / src', das Untermodul befindet sich Drupal\my_submodulein 'my_module / modules / my_submodule / src' und so weiter
Clive
Danke Clive, das macht Sinn! Was ist mit Unterordnern? Irgendeine Idee, ob dies noch unterstützt wird und wie das beim automatischen Laden einer Klasse aussehen würde?
Dustinmoris

Antworten:

7

@Clive ist richtig.

Der Namespace ist immer Drupal\{module_name} . Wo sich dieses Modul befindet, spielt keine Rolle (solange es sich irgendwo befindet, wo Drupal es finden kann). Dieser Namespace zeigt immer auf $path_to_module/src.

Es würde unmöglich anders funktionieren. Verschiedene Sites haben Module in einer unterschiedlichen Struktur und an unterschiedlichen Orten, aber der gleiche Code muss funktionieren, egal wo.

Berdir
quelle
Danke Clive und Berdir! Ich denke, ich habe noch eine weitere Frage: Ist es möglich, einen zusätzlichen Namespace zu registrieren, der auch auf den Ordner modules verweist? Beispiel: DrupalModules \ {Modulname}, um auf $ path_to_module / src zu verweisen? Ich bitte Sie, besser zu verstehen, wie Sie unsere Klassen heute so gestalten können, dass sie eines Tages beim Umstieg auf D8 wenig Reibung verursachen.
Dustinmoris
1
Wenn die Klassen Drupal-spezifisch sind (dh Sie schreiben keine eigenständige Bibliothek), ist es wahrscheinlich besser, sie \Drupalaus Gründen der Konsistenz beizubehalten. Aber trotzdem interessante Frage, ich möchte Sie ermutigen, es als separate Frage zu stellen. In der Tat, wenn Sie dies nicht tun, werde ich wahrscheinlich :)
Clive
1
Sie könnten wahrscheinlich, ja, system_register () und drupal_classloader_register () sehen. Diese Helfer funktionieren mit dem Hardcode "Drupal \", aber Sie könnten den class_loader-Dienst direkt erhalten. Aber wie @Clive sagte, würde ich es nicht empfehlen, es gibt keinen Grund, dies zu tun, es sei denn, Sie fügen eine externe Bibliothek hinzu.
Berdir
Coolio, das macht Sinn! Danke Leute! @Clive: Wie Sie vorgeschlagen haben, habe ich drupal.stackexchange.com/questions/142309/…
dustinmoris am
Sie können das Mongodb-Modul bereits überprüfen, um die Struktur zu sehen.
6

Die Namespaces basieren auf dem automatischen Laden von PSR-4. Überprüfen Sie die Spezifikation http://www.php-fig.org/psr/psr-4 .

Wenn Sie Submodule verwenden möchten, können Sie die nächste Ordnerstruktur verwenden. d8:

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

Der Namespace für das "my_module":

Drupal\my_module\Controller\A

Der Namespace für das "my_sub_module":

Drupal\my_sub_module\Controller\B

Weitere Informationen finden Sie unter PSR-4-Namespaces und Autoloading in Drupal 8 .

dmouse
quelle
Danke, dmouse. Anfangs habe ich meine Frage in der verlinkten Ressource auf Drupal.org gepostet und jetzt habe ich meine eigene Frage bearbeitet, um auch auf diesen Thread zu verweisen;)
dustinmoris