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?


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 { ... }

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


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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.