TWIG Extension / Funktion erstellen?

Hallo zusammen,

ich versuche momentan eine eigene TWIG Funktion zu erstellen, die ich in meinen Template-Dateien aufrufen kann um die Funktionalität meines Themes zu erweitern.

Laut den TWIG und Shopware Dokus kann hierzu ein Service dienen der im eigenen Theme registriert und verwendet werden kann.

Ich habe also basierend auf den entsprechenden Dokus die Erweiterung erstellt:

ThemeOrdner/src/Twig/myExtension.php:

und anschließend eine services.xml mit autowire Option erstellt:

ThemeOrdner/src/Resources/config/services.xml:

 Dadurch sollte es ja eigentlich möglich sein, mittels {{ twigFunktion }} die Ausgabe von “Hallo Welt!” im Twig-Template zu ermöglichen.

Ich bekomme beim theme:compile allerdings immer eine Fehlermeldung:
 

Expected to find class "App\Twig\myExtension" in file "/mnt/shared/shopware/base/www/custom/plugins/ThemeOrdner/src/Twig/myExtension.php" while importin  
  g services from resource "../src/*", but it was not found! Check the namespace prefix used with the resource. 

Mache ich hier irgendwas grundsätzliches falsch? Die class ist doch da! Stimmen die Pfade zur myExtension.php und services.xml? Ich habe auch schon gelesen, dass evtl. der composer autoloader entsprechend ergänzt werden muss. Habe ich wie folgt getan:
 

"autoload": {
    "psr-4": {
      "ThemeOrdner\\": "src/",
      "App\\": "src/"
    }
  },

und dann ein composer dump-autoload ausgeführt. Gleiches Ergebnis: Ich bekomme besagt Fehlermeldung.

Ich wäre dankbar, wenn mir jemand sagen könnte ob meine Vorgehensweise grundsätzlich richtig ist oder ob das so gar nicht funktionieren kann. Evtl. gibt es ja auch eine schönere Methode das zu erreichen, was ich möchte.

Bin für jeden Hinweis dankbar :slight_smile:

Hallo,

Das klingt so als hättest du das Plugin von Hand hochgezogen und nicht das Command benutzt?:

php bin/console plugin:create

Folgende Probleme sehe ich:

Problem 1:

Die Fehlermeldung sagt klar welche Klasse gesucht wird

Expected to find class "App\Twig\myExtension" ...

Deine Klasse heisst aber nicht „myExtension“.

Der Autoloader von Composer versucht anhand des Dateinamen die dazugehörige Klasse zu finden.

Generell würde ich dir auch ein anderes naming empfehlen.
Namespace „App“ abändern in etwas genaueres und auch bei allen auf Groß- & Kleinschreibung achten.

Dateipfad bei obigen Beispiel: MyPlugin/Twig/MyExtension.php

Problem 2:

Benutze am besten KEIN autowire und autoconfigure. Für Bundles und/oder Plugins sowieso nie.

;

Den PSR-4 autoloader-Teil wieder aus der composer.json raus den du eingefügt hattest und dafür rein:

"autoload": {
  "psr-4": {
    "MyPlugin\\": "src/"
  }
},

Danach cache leeren + composer dump-autoload (evt nochmal ein bin/console plugin:refresh).

1 „Gefällt mir“

Hallo ThomasBaier,

recht herzlichen Dank für deine ausführliche Erläuterung :slight_smile:

Meine Klasse hieß myExtension - das habe ich nur beim Übertragen ins Forum verschlimmbessert. Daran lag es also nicht. Dank deiner Hinweise bzgl. Namespace und der services.xml funktioniert es nun aber trotzdem reibungslos. Ich war schon am verzweifeln, aber nun ist alles gut.

Nochmals vielen Dank :slight_smile: