Eigenen PHP-Code hinzufügen: Error: The service has a dependency on a non-existent service

Hey,

ich habe eine lokale Anwendung und möchte diese jetzt in Shopware 6 integrieren. In dieser nutze ich auch viel PHP.

Dieses versuche ich gerade in mein Plugin einzubinden. Jedoch ohne Erfolg.

Ich finde auch kaum etwas dazu, wie ich jetzt den PHP-Code in Shopware 6 einbinden kann. Ich habe jetzt einen neuen Ordner „Custom“ in Designer/src/Storefront/ erstellt und darin dann eine PHP-File erstellt.

In dieser PHP-File habe ich dann den entsprechenden Namespace hinzugefügt und die Klasse erstellt:

namespace ProductDesigner\Storefront\Custom;

class MotiveMenu{

    public function __construct()
    {
        
    }

    public static function getAllMotive(){}

Danach habe ich in der services.xml ein neues Argument zum ProductDesignerController-Service hinzugefügt:

<service id="ProductDesigner\Storefront\Controller\ProductDesignerController" public="true">
            <argument type="service" id="ProductDesigner\Storefront\Page\ProductDesigner\ProductDesignerPageLoader" />
            **<argument type="service" id="ProductDesigner\Storefront\Custom\MotiveMenu" />**
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
        </service>

Danach im ProductDesignerController die Klasse MotiveMenu hinzugefügt und die Funktion ausgeführt und den Rückgabewert dann der renderStorefront-Funktion als Parameter übergeben.

**use ProductDesigner\Storefront\Custom\MotiveMenu as MotiveMenu;**

/**
 * @Route(defaults={"_routeScope"={"storefront"}})
 */
class ProductDesignerController extends StorefrontController{

    private ProductDesignerPageLoader $productDesignerPageLoader;

    public function __construct(ProductDesignerPageLoader $productDesignerPageLoader){
        $this->productDesignerPageLoader = $productDesignerPageLoader;
    }

    /**
     * @Route("/designer", name="frontend.productDesigner.show", methods={"GET"})
     */
    public function showProductDesigner(Request $request, SalesChannelContext $context) : Response{

        $page = $this->productDesignerPageLoader->load($request, $context);
        **$motiveMenu = MotiveMenu::getAllMotive();**
        
        return $this->renderStorefront("@ProductDesigner/storefront/page/productDesigner/index.html.twig", [
            'page' => $page,
            **'motiveMenu' => $motiveMenu**
        ]);
    }
}

Wenn ich jetzt die Seite aufrufe erhalte ich folgende Fehlermeldung: The service „ProductDesigner\Storefront\Controller\ProductDesignerController“ has a dependency on a non-existent service „ProductDesigner\Storefront\Custom\MotiveMenu“.

Dies zeigt mir, dass meine Vorgehensweise doch nicht richtig war. Wie kann ich denn nun eigenen PHP-Code in mein Shopware Plugin hinzufügen und die Rückgabewerte der renderStorefront-Methode übergeben?

Die Fehlermeldung sagt eigentlich alles aus.

Du versuchst einen Service aufzurufen, den Symfony nicht kennt. Nur weil du eine php class angelegt hast, heißt das nicht, dass diese auch geladen wird.

Du musst aus ProductDesigner\Storefront\Custom\MotiveMenu ebenfalls einen Service machen.

Hi Max,

danke für deine Antwort.

Habe ich dich richtig verstanden, dass Shopware auf Symfony basiert und in diesem Zusammenhang auch Symfony nutzt?

Ja, Shopware nutzt als Basis Symfony. Alles was du in Symfony machen kannst, kannst du auch in Shopware tun.