Eigener Service aus Plugin in Administrationsmodul

hallo Leute kurz ne frage: wie injecte ich einen eigenen Service (Vendor\Plugin\Service\MyService.php) in ein eigenes admnisitrationsmodul. Die doku ist wirklich unzureichend es wird immer nur ein beispiel behandelt und wie gesagt zusammen hängend. auch die backend videos sind nicht besser aufgebaut und infos finden ist sxchwer

das hier ist ein eigener servcie aber nur über js

hier ein beispiel wie man repository injectet

aber keine eigenen backend services. Dieses inject müsste doch irgendwo dokumentiert sein wo finde ich diese infos? oder gibts tatsächlich nur repositoryFactory?

Das Frontend ist Symfony und twig. Das Backend ist Vue. Vue nutzt die Shopware-API um auf entsprechende Services zuzugreifen.

In deinem ersten Link ist eine externe URL. Hier einfach die Shopware-API als URL nutzen.

Der Service ist eben eine synchronisation von nem erp. Ich möchte eh verhindern, dass der von aussen per link aufrufbar ist.

Gibt es alternativen? (sorry ich bin Shopware Newbie)

Wenn der API-Call kein entsprechendes Secret (Zugangsdaten) hat, dann musst du ihn ja nicht ausführen lassen.

also das erp hat das eben. ich muss mich im call jedes mall mit http einloggen. die zugangsdaten sind als konfiguration hinterlegt. aber auch wegen zu hoher last möchte ich nicht, dass man per url request einfach so importe starten kann.

Mal ander gefragt: was kann ich grundsätzlich in Vuejs injecten ausser repositoryFactory?
dann mach ichs ev. über nen umweg…

Du kannst du per Vue deinen Symfony Service triggern, der dann mit dem ERP synchronisiert. So gibt es keine direkte Verbindung zum ERP.

genau das ist mein usrsprüngliches ziel. aber wie müsste ich das machen?

Du schreibst deinen Service als Symfony (Shopware) Service. Diesen rufst du per API-Call über das Backend auf.

Aber wenn ich eine Route fürp Store-Api festlege ist dass dann nur im BackendContext (wenn im Backend eingeloggt) erreichbar? oder kann ich das so einstellen?

Bin mir nicht sicher, ob der API-Call auf das Backend beschränkt werden kann. Ich verstehe ehrlich gesagt aber auch nicht, wieso das relevant ist. Wer kein Secret hat, der kann den Call nicht ausführen.

Ist es den nicht problematisch, dass dieser Key ganz einfach aus den kompilierten, public-js-Dateien ganz einfach gefunden werdenkann. ich finde es ist keine grosse Sicherheitshürde oder habe ich das falsch verstanden?

Das setzt ja voraus, dass sich jemand zuvor in das Admin-Backend erfolgreich eingeloggt hat. Dann musst du natürlich noch mit Benutzerrechten arbeiten, wenn du zwischen Admin und anderen Accounts, die Zugang zum Backend haben unterscheidest.

Ich hab verstanden was du meinst. dachte du sprich von sale chanel api token aber ich habe jetzt entdeckt, dass es auch funktionen wie loginService etc hibt wo man das access-Token ziehen kann.

Leider gibts nichts in der doku dazu. hat jemand ein aktuelles Beispiel? schein mit 6.4 was geändert zu haben…

hier für den nächsten „Suchenden“ :smiley:

MyPlugin/src/Controller/AdminApi/Example/ExampleController.php

<?php declare(strict_types=1);

namespace Vendor\Plugin\Controller\AdminApi\Example;

use Shopware\Core\Framework\Context;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;

/**
 * @RouteScope(scopes={"api"})
 */
class ExampleController extends AbstractController
{
    /**
     * @Route("/api/my/call", name="api.my.call", methods={"GET"})
     */
    public function myCall(): JsonResponse
    {
        return new JsonResponse(['You successfully created your first controller route']);
    }

// hier mit weiteren "action" erweitern und bei Bedarf Services gemäss Doku injecten

}

im MyPlugin/…/config/services.xml gemäs doku ergänzen

....
        <service id="Vendor\Plugin\Controller\AdminApi\Example\Example" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
        </service>
...

im MyPlugin/…/config/routes.xml gemäss Doku ergänzen (ausser, dass meine Routen im Controller gesucht werden udn nicht in Core/Content → hier auch anpassen, falls andere Controller drin sind welche keine direkten Routen haben)

<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
        https://symfony.com/schema/routing/routing-1.0.xsd">


    <import resource="../../Controller" type="annotation" />
</routes>

Danach testen wir inder console kurz obs läuft:
bin/console debug:router api.my.call ← name welcher im Controller def. wurde

und am ende in der vue admin componente

...
    inject: [
        ...
        'loginService',
        'syncService'
         ...
    ],
....
    methods: {
        myCallVueAction(){
            const headers = {
                Authorization: `Bearer ${this.loginService.getToken()}`
            };
            const httpClient = this.syncService.httpClient;
            httpClient.get("http://localhost:8080/api/my/call",{headers:headers} )


        }
    }
});

Laut alten Beispiel kann man auch die Base-Api-URl irgendwie auslesen (this.getApiBasePath()) aber in 6.4 funktionierts nicht mehr und die doku hilft leider wieder mal nicht weiter…

Wenn ich es gefunden habe ergänze ch es noch :smiley: