Plugin kann nicht auf Shopware() Container zugreifen?

Hallo :slight_smile:

Ich habe hier ein Plugin geschrieben, das soweit auch tut was es soll, allerdings soll es jetzt um eine Funktion erweitert werden, die eine Variable aus der Session ausliest (diese wird von einem anderen Plugin gesetzt).

Also war der Plan, in der „__construct“ Methode den Container zu setzen und dann in weiter unten etwas nach dem Motto $session = $this->container->get('session') zu machen. Klingt ja erstmal einfach.

Das Problem ist, dass der Container, der mir in der „__construct“ Methode übergeben wird, anscheinend leer ist? Wenn ich versuche, ihn mir ausgeben zu lassen mit file_put_contents('test.txt', json_encode($container);, steht in der Datei nur „{}“, wenn ich es mit serialize probiere, funktioniert das Backend nicht mehr und es kommt nur eine Fehlermeldung („Ups! Ein Fehler ist aufgetreten!“ - mehr nicht - also unsere selbst angelegte Fehler-Nachricht). Das passiert übrigens auch, wenn ich einfach versuche, trotzdem auf den Container mit $this->container->get('session') zuzugreifen.

Auch wenn versuche, über die veraltete Methode drauf zuzugreifen mit Shopware()->Container(), klappt es nicht.

Nachfolgend der Anfang der Subscriber-Unit, im Plugin-Verzeichnis als Subscriber/FrontendRegister.php abgelegt.

<?php

namespace myPlugin\Subscriber;

use Enlight\Event\SubscriberInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class FrontendRegister implements SubscriberInterface{
    private $container;

    public function __construct(ContainerInterface $container){
        $this->container = $container;
        file_put_contents("session.txt", json_encode($this->container));
    }
...

Evtl. kann mir hier jemand erklären, was genau ich falsche mache, dass ich nicht auf den Container zugreifen kann? Wäre sehr dankbar :slight_smile:

Okay, Update:

Dass der Container leer ist, war ein Missverständnis. Wenn ich mit $this->container->get('dbal_connection') auf die DB Connection zugreife, klappt es. Sobald ich aber versuche, etwas von der Session auszulesen mit $this->container->get('session'), fliegt es mir um die Ohren. Im Frontend geht’s, aber sobald ich das Backend aufrufe, kommt wieder die Fehlermeldung.

In der Logdatei steht folgendes:
core.CRITICAL: The "shop" service is synthetic, it needs to be set at boot time before it can be used.

Hallo, im Backend gibt es ohne registrierten Shop keine Session,

Du musst erst einen Shop registrieren damit du die Session initialisiern kannst…

engine/Shopware/Components/ShopRegistrationService.php ->registerShop($shop)

Hallo @hulle24

das was Dennis sagt. Du solltest nicht schon im Constructor versuchen auf die Session zuzugreifen.
Stattdessen erst in deiner Event-Callback-Methode und auch erst dann, wenn du sichergestellt hast, dass du in einem Request aus der Storefront bist. Um eben sicherzustellen, dass du einen Shop und eine Session hast.

Viele Grüße aus Schöppingen
Michael Telgmann

Hallo Dennis & Michael,

vielen Dank, den Shop vorher zu registrieren war des Rätsels Lösung! :slight_smile:

Und ja, im Constructor auf die Session zuzugreifen, war sowieso nicht mein Plan, das war nur ein Test. Habe das Auslesen der Variable jetzt in einer Callback-Methode untergebracht und es funktioniert wunderbar. :slight_smile: