Zum Inhalt springen

Service Class Dependency Injection innerhalb Repository

Erstellt am 8. Januar 2020 · 1 Antwort · letzte Antwort am 9. Januar 2020

Tags: PHP, TYPO3 9, Frage

typo3dev_extbase ·

Servus,

wie kann ich bestenfalls meine Service-Objekte innerhalb meines Repositorys "injecten" ?

In meiner Erweiterung unter Classes/Services verwende ich diverse Service-Klassen.
Für jede Service-Klasse wird unter Classes/Services/ContainerService jeweils ein Objekt instanziert. Dies passiert innerhalb einer getXyService()-Funktion mittels GeneralUtility::makeInstance('VendorName\\MyExtension\\Service\\MyClassService').

In meinem Repository möchte ich dann auf das ContainerService-Objekt durch Dependency Injection zugreifen, damit diese nur einmalig instanziert und genutzt werden kann.
Folgenden Ansatz habe ich bisher versucht:

In ContainerService:

class ContainerService {

private $myService;

/**
* @return MyService
*/
public function getMyService() {

if ($this->myService === null) {
$this->myService = GeneralUtility::makeInstance('VendorName\\MyExt\\Service\\myService');
}

return $this->myService;
}
...

In der RepositoryClass:

use VendorName\MyExt\Service\ContainerService

class myRepository extends Repository
{

/**
* @TYPO3\CMS\Extbase\Annotation\Inject
* @var ContainerService
*/
public $containerService;

/**
* ContainerService
*
* @param ContainerService $containerService
*/
public function injectContainerService(ContainerService $containerService): void
{
$this->containerService = $containerService;
}
...

In der RepositoryClass greife ich dann auf ein ServiceObjekt zu, um diverse Methoden dieses Service zu nutzen, welche mir dann im Endeffekt Daten in Form von JSON (oder sonstiges) liefern.

Diese sollen dann im entsprechenden Controller abgerufen und verarbeitet werden.

Folgende Fehlermeldung erhalte ich:

Class ContainerService does not exist. Reflection failed.

Flush Cashe & Dump Autoload haben leider nicht weitergeholfen.

typo3dev_extbase · · Beste Antwort

Fehler gefunden:
Es lag am Type hinting und den Annotations.
statt ContainerService den kompletten Namespace verwenden \VendorName\MyExt\Service\ContainerService