Jede Klasse überall in TYPO3 instanzieren

Mit diesen 3 Features kannst du jede Klasse überall in TYPO3 instanzieren. Egal, ob innerhalb oder außerhalb eines Controllers, in einer eigenen Klassen oder in einem ViewHelper.

Copy & Paste - Vorlagen

Schlüsselwort: new

// ohne Argumente
$project = new \Slavlee\CampusFirstextension\Domain\Model\Project();

// mit Argumente
$project = new \Slavlee\CampusFirstextension\Domain\Model\Project($argument1, $argument2);

GeneralUtility::makeInstance

use TYPO3\CMS\Core\Utility\GeneralUtility;
// ohne Argumente
$project = GeneralUtility::makeInstance(\Slavlee\CampusFirstextension\Domain\Model\Project::class);

// mit Argumente
$project = GeneralUtility::makeInstance(\Slavlee\CampusFirstextension\Domain\Model\Project::class, $argument1, $argument2);

ObjectManager->get

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);

// ohne Argumente
$project = $objectManager->get(\Slavlee\CampusFirstextension\Domain\Model\Project::class);

// mit Argumente
$project = $objectManager->get(\Slavlee\CampusFirstextension\Domain\Model\Project::class, $argument1, $argument2);

Erläuterungen

Wenn du in TYPO3 eine Instanz einer Klasse bilden möchtest, dann gibt es 3 Möglichkeiten.

  1. Schlüsselwort: new
  2. GeneralUtility::makeInstance
  3. ObjectManager->get

Das Schlüsselwort: new

Das Schlüsselwort: new wird jedem PHP Programmierer ein Begriff sein. Damit lässt sich eine Instanz von einer Klasse in PHP erzeugen. Das ist gleichzeitig die standardmäßige Herangehensweise in PHP und man ist geneigt diese auch in TYPO3 anzuwenden.

$project = new \Slavlee\CampusFirstextension\Domain\Model\Project();

Es ist auch tatsächlich möglich dieses Schlüsselwort zu verwenden. Und manchmal ist es auch sinnvoll das Schlüsselwort: new zu verwenden. In der Regel empfehle ich dir jedoch die anderen beiden Möglichkeiten zu nutzen. Das Schlüsselwort: new solltest du nur dann verwenden, wenn du folgende Technologien von TYPO3 nicht nutzen möchtest:

  • Injection
  • anderen Autoren per XClass die Möglichkeit bieten, deine Klasse zu überschreiben
  • Annotationen von Extbase bzw. Symfony

Wenn dir diese Begriffe noch nichts sagen, dann empfehle ich dir ebenfalls nicht das Schlüsselwort: new zu verwenden.

GeneralUtility::makeInstance

Die GeneralUtility - Klasse bindet viele nützliche Funktionen, die du in der TYPO3 Extensionentwicklung nutzen kannst. Hier lohnt es sich ein Blick in die TYPO3 API zu nehmen.

Eine statische Methode von GeneralUtility ist die makeInstance - Methode:

public static function makeInstance($className, ...$constructorArguments)

Diese statische Methode erzeugt ebenfalls eine Instanz einer Klasse. Den Klassennamen gibt an im ersten Parameter mit vollständigen Namespace an. Der zweite Parameter kann genutzt werden, um eventuellen Konstruktoren Argumente mitzuliefern.

Die Aufgabe ist somit die selbe wir beim Schlüsselwort: new. Es hat nur den großen Unterschied, dass andere Autoren per XClass deine Klasse überschreiben kann. Damit gibst du also andere Entwickler die Möglichkeit programmatischen Einfluss auf deine Extension zu nehmen. Solche Schnittstellen sind immer gerne gesehen und sollten in jeder guten Extension vorhanden sein.

ObjectManager->get($objectName, ...$constructorArguments)

Die get() - Methode ist eine öffentliche Methode, jedoch nicht statisch. Das heisst, man muss erst eine Instanz vom ObjectManager erstellen. Das geschieht in der Regel mit der GeneralUtility::makeInstance Funktion.
Der ObjectManager wird dann ebenfalls eine Instanz aus einer Klasse erstellen. Dabei bietet es alle Funktionalitäten wie die GeneralUtility::makeInstance() - Methode. Darüberhinaus hat es noch den Vorteil, dass die Injection von TYPO3 wirken.

Wenn du also unsicher bist, wie der korrekte Umgang bei Erstellung einer Instanz einer Klasse ist, dann nutze den ObjectManager. Nutze ebenfalls den ObjectManager, wenn die Klasse die du instanzierst, Annotationen oder Methoden hat die mit inject - beginnen.