Zum Inhalt springen

Dependency Injection

Erstellt am 23. Juni 2023 · 1 Antwort · letzte Antwort am 26. Juni 2023

Tags: Frage

discoebbe ·

Hi.

Folgendes Setup: Typo3 11.5.28
Es gibt eine "Shop Extension" die für Daten Model "Product" ein Repository hat. Das funtktioniert innerhalb der Shop Extension wunderbar.

Weiterhin gibt es eine Extension "Connector" die via Composer installiert wurde. Diese funktioniert an und für sich auch wie sie sollte und verbindet den Shop mit der Warenwirtschaft des Kunden.

Nun zum Problem:
In der Connector Extension brauche ich das Product Repository aus der Shop Extension. Mittels ObjectManager kann ich mir das leicht verfügbar machen, allerdings ist der ObjectManager deprecated.

Daher will ich des ProductRepository gern über Dependency Injection (constructor) einbinden.

Dazu habe ich für den Connector einen Services.yaml erstellt. Diese sieht so aus

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  Jtl\Connector\Kerzenprofi\:
    resource: '../src/*'

  Jtl\Connector\Kerzenprofi\Controller\DebugUtility:
    arguments:
      $productRepository: '@\Hc3\Kpshop\Domain\Repository\ProductRepository'

Mein Controller "DebugUtility" sieht so aus:

namespace Jtl\Connector\Kerzenprofi\Controller;

use TYPO3\CMS\Core\Utility\GeneralUtility;

class DebugUtility extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController{


    /**
     * productRepository
     *
     * @var \Hc3\Kpshop\Domain\Repository\ProductRepository
     */
    protected $productRepository;
    
    /**
     * @param \Hc3\Kpshop\Domain\Repository\ProductRepository $productRepository
     */
    public function __construct(
        \Hc3\Kpshop\Domain\Repository\ProductRepository $productRepository
    )
    {
        $this->productRepository = $productRepository;
    }

    ...
}

Aus meiner Sicht alles korrekt. Aber ich bekomme im Installtool immer den Fehler:

The service "Jtl\Connector\Kerzenprofi\Controller\DebugUtility" has a dependency on a non-existent service "\Hc3\Kpshop\Domain\Repository\ProductRepository".

discoebbe ·

Problem gelöst: für alle die es auch mal betrifft:

In der Services.yaml des Connectors habe ich zusätzlich das Repository des Shops, das ich per Constructor Injection in meinem Connector Controller brauche auf public:true gestellt. Und plötzlich geht die Dependency Injection wie erwartet.