Wie füge ich eine benutzerdefinierte Klassendatei in ein Modul ein?

10

In der Drupal 7- Modulentwicklung könnte ich eine benutzerdefinierte Inc-, API- oder PHP-Klassendatei mithilfe der Datei file [] = in der Datei module.info oder der Funktion drupal_load_included () einfügen.

Was ist bei D8 mit PSR der richtige Weg, um ein "einfaches altes PHP-Objekt" zu verpacken und darauf zu verweisen DefaultController.php? Denken Sie so etwas wie : $a = new POPO();.

Ist es namespaceausreichend, nur die PHP-Datei mit der Klasse anzugeben? Woher weiß der Controller (oder das Modul im Allgemeinen), ob er auf diese Klasse verweist oder nach ihr sucht?

Rick
quelle
Dieser Link Erstellen von Drupal 8.x-Modulen könnte hilfreich sein
Krishna Mohan
Ja, ich habe drupal.org/node/2087879 gelesen, aber nachdem ich die Anweisung file [] = nicht gesehen habe, hat sie diese spezielle Frage der Dateieinbeziehung leider nicht beantwortet.
Rick

Antworten:

11

Du benutzt nicht file[] = ...mehr. Stattdessen werden Klassen automatisch geladen. Zum Beispiel habe ich ein Modul mit der folgenden Dateistruktur:

  • views_hybrid /
    • views_hybrid.info.yml
    • views_hybrid.module
    • src /
      • Plugin /
        • Feld/
          • FieldFormatter /
            • HybridFormatter.php

HybridFormatter.php definiert eine Klasse namens HybridFormatter.

Wenn ich in meiner .module-Datei meine IDE (in diesem Fall NetBeans) eingebe, wird HybridFormattersie automatisch vervollständigt, \Drupal\views_hybrid\Plugin\Field\FieldFormatter\HybridFormatter::da sie automatisch geladen wird. Da ich nicht möchte, dass der gesamte Pfad mein Modul verschmutzt, habe ich oben die Zeile platziert.

use Drupal\views_hybrid\Plugin\Field\FieldFormatter\HybridFormatter;

zusammen mit useAnweisungen für andere Klassen, die ich für die Verwendung mit meinem Modul einbeziehe.

Der Namespace wird in HybridFormatter.php folgendermaßen definiert:

namespace Drupal\views_hybrid\Plugin\Field\FieldFormatter;

class HybridFormatter extends FormatterBase { ... }
Beth
quelle
Um sicherzustellen, dass ich alles verstehe, wird HybridFormatter.php automatisch geladen ... automatisch? Es ist kein include_once () erforderlich? Ist in HybridFormatter.php ein Namespace definiert?
Rick
Es gibt keine Notwendigkeit für include_onceoder require_onceoder irgendetwas. Hybridformatter.php definiert einen Namespace. Ich werde in die Antwort aufnehmen.
Beth
@beth Kannst du mir helfen? drupal.stackexchange.com/questions/233565/…
RobinSon
8

Ich möchte das hinzufügen, um eine benutzerdefinierte Klasse aufzunehmen, die nicht in das D8 "Plugin, Controller, Formular usw." passt. Standardmäßig können Sie dies weiterhin tun, wie in der PSR-4-Übersicht hier angegeben

Für meinen Anwendungsfall habe ich eine "CustomClass.php" in / modules / custom / my_module / src / abgelegt. Am Anfang der Datei habe ich die Namespace-Deklaration eingefügt

namespace Drupal\my_module;

und in der Datei, in der ich es verwenden wollte (in diesem speziellen Fall my_theme.theme), habe ich hinzugefügt

use Drupal\my_module\CustomClass;
ben.hamelin
quelle