Grundlegendes zu Drupal 8 und Namespaces

7

Ich bin neu in Namespaces und übe mit Drupal 8. Ich habe ein benutzerdefiniertes Modul erstellt und den Contrib, Devel, installiert.

In meinem Modul habe ich einen Block definiert. Hier ist mein Code:

Namespace Drupal \ twitter_pull \ Plugin \ Block;
benutze Drupal \ block \ BlockBase;

/ **
 * Bietet einen Block zum Ausführen von PHP-Code.
 * *
 * @Block(
 * id = "twitter_pull_tweets_block",
 * admin_label = @Translation ("Twitter Tweets")
 *)
 * /
Klasse TweetsBlock erweitert BlockBase {

  / **
   * Erstellt das renderbare Array für dieses Block-Plugin und gibt es zurück.
   * *
   * @return Array
   * Ein renderbares Array, das den Inhalt des Blocks darstellt.
   * *
   * @see \ Drupal \ block \ BlockViewBuilder
   * /
  öffentliche Funktion build () {
    dpm (Array ('this', 'is', 'a', 'test'));
    return 'das ist ein Block';
  }}
}}

und es funktioniert gut. Was ich aber nicht verstehe ist: Warum habe ich Zugriff auf die Entwicklungsfunktionen? Wo füge ich in meinen Code den Namespace für devel ein, auf den ich Zugriff auf dpm () haben soll?

user1015214
quelle

Antworten:

7

Direkt aus den PHP Global Space- Dokumenten:

Ohne Namespace-Definition werden alle Klassen- und Funktionsdefinitionen im globalen Bereich platziert - wie in PHP, bevor Namespaces unterstützt wurden. Wenn Sie einem Namen \ voranstellen, wird angegeben, dass der Name auch im Kontext des Namespace aus dem globalen Bereich erforderlich ist.

Devel's dpm()wird im 'Global Space' deklariert, und da dpm()in Ihrem Namespace keine andere Funktion deklariert ist, wird die ' Global'- Funktion verwendet (das Vorhergehende ist nicht erforderlich \).

Clive
quelle
3
Richtig, außerdem sind Funktionen speziell und unterscheiden sich von Klassen. Klassen im globalen Namespace müssen mit einem führenden \ referenziert werden, während Funktionen automatisch auf den globalen Namespace zurückgreifen. Was jedoch verwirrend ist, ist, dass der Fehler den aktuellen Namespace enthält, wenn eine Funktion nicht gefunden wird (weder globaler noch aktueller Namespace).
Berdir
Sehr interessant. Ich dachte, Namespaces wären eine Anforderung in Drupal 8, aber ich sehe, dass die Datei devel.module keine Namespaces hat und sich dort die Funktion dpm befindet. Sind Namespaces nur dann nicht erforderlich, wenn sie sich in der .module-Datei befinden?
user1015214
2
‚Erforderlich‘ vielleicht nicht das richtige Wort ist ... Drupal verwendet eine PSR-4 Autoloader Klassen entdecken basierend auf einer strengen Namenskonvention (PHP suchen gesagt werden , Drupal\my_module\SomeClassin /path/to/my_module/src/SomeClass.php, zum Beispiel). Für Klassen, die nicht automatisch durch Anmerkungen entdeckt werden (wie Plugins), müssen sie theoretisch überhaupt keinen Namespace haben. PHP / Drupal würde sich nicht darum kümmern, solange die Klassennamen innerhalb des globalen Raums eindeutig sind. Natürlich ist es schlecht, den globalen Raum zu verschmutzen, und die Modularisierung des eigenen Codes ist immer eine gute Sache. Verwenden Sie ihn daher immer für Klassen ...
Clive
1
... Was Funktionen angeht, muss ich noch auf ein Framework stoßen, das Namespaces-Funktionen bietet. Ich bin mir sicher, dass es gültige Edge-Cases dafür gibt, aber in einer OO-Architektur macht es einfach nicht viel Sinn. D8 ist immer noch eine Mischung aus prozeduralem und OO-Code, sodass Sie immer noch viele Funktionen mit globalem Gültigkeitsbereich finden. Das Hook-System eignet sich auch nicht besonders gut für Funktionen mit Gültigkeitsbereich. Mit globalen Funktionen ist das Ganze viel einfacher. Sie können also sogar sagen, dass D8 die Anforderung hat, keinen Namespace für Funktionen zu verwenden
Clive