Problem bei der Aktualisierung meines Plugins von 6.4 auf 6.5. Session

Ich aktualisiere das Plugin von 6.4 auf 6.5, aber ich bekomme den folgenden Fehler:

Hier ist der Teil meines PHP-Codes, der „session“ verwendet. Siehe Zeile 3.

Hier ist, was ich hatte:


<?php

namespace ErpSpecialPrice\Subscriber;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpFoundation\Session\Session;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemQuantityChangedEvent;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemRemovedEvent;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\PrefixFilter;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\Uuid\Uuid;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\AndFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
use Shopware\Core\Defaults;
use Shopware\Core\Checkout\Cart\LineItem\LineItemCollection;
use Shopware\Core\Content\Product\Aggregate\ProductPrice\ProductPriceCollection;
//use Shopware\Core\Checkout\Cart\Rule\LineItemCustomFieldRule;

Ich habe einen Blog über das Update gelesen und Github Copilot verwendet, und es wurde vorgeschlagen, stattdessen Folgendes zu verwenden, aber es scheint nicht zu funktionieren. Hier ist es (siehe Zeile 4):


<?php

namespace ErpSpecialPrice\Subscriber;
use Doctrine\DBAL\Connection;
//use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Request;
// Diese Methode sollte innerhalb der Klassendefinition sein
class Subscriber implements EventSubscriberInterface
{
    public function indexAction(Request $request) { 
        $session = $request->getSession(); 
        // do something with the session object 
    }
}
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemQuantityChangedEvent;
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemRemovedEvent;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\PrefixFilter;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\Uuid\Uuid;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\AndFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
use Shopware\Core\Defaults;
use Shopware\Core\Checkout\Cart\LineItem\LineItemCollection;
use Shopware\Core\Content\Product\Aggregate\ProductPrice\ProductPriceCollection;
//use Shopware\Core\Checkout\Cart\Rule\LineItemCustomFieldRule;

Hat jemand eine Idee, was das Problem sein könnte?
Danke

Vielleicht versuchst du es noch einmal mit einer sauberen Formatierung? Dazu gibt es im Editor Code Blöcke.

Wo ist denn die Fehlermeldung? Was besagt sie?

Für Shopware 6.5 gibt es noch relativ wenig Code im Gegensatz zu 6.4. Bin mir nicht sicher, wie clever Copilot da ist und ob er die richtigen Klassen nutzt.

Wieso führst du dein Code nicht in 6.4 aus und liest überall die Deprecated Meldungen aus. Dann weißt du, was du ändern musst.

Ich habe diese Informationen aus einem Online-Dokument über die Umstellung von 6.4 auf 6.5 erhalten.

Usage of session

If you’re working with Shopware 6.5 and you’re encountering issues with injecting the session in your services.xml file, it’s because this functionality is no longer supported. Instead, you should use the request object to get access to the session.

To retrieve the session object, you can use the following code:

$event->getRequest()->getSession();

This will retrieve the session object from the request and allow you to use it as needed in your code. By making this change, you should be able to resolve any issues related to injecting the session in Shopware 6.5 and ensure that your code is using the latest best practices for working with sessions.

Das Problem ist, dass der Wechsel zu 6.5 viele der 6.4 Plugins kaputt gemacht hat. Daher funktioniert dieses Plugin in 6.4, aber nicht in 6.5.

Wenn du ein Event subscribst, dann wirst du auch ein event erhalten und nicht ein request.

Dann wird vermutlich auch $event->getRequest()->getSession(); funktionieren.

Die sales_channel.*.loaded events speichern aber kein Request-Object. Wie erhalte ich die Session in einem Listener auf so einem Event?

Ist das ganze mal wieder nicht richtig durchdacht oder übersehe ich hier was?

Cheers

Doch, das ganze ist „richtig durchdacht“. Natürlich kennt nicht jedes event jeden service. Du musst dir den „request_stack“ injecten.

Viele Grüße

Da bin ich im Laufe des Tages auch heute drauf gestoßen.
Ich finde aber trotzdem, dass die Dokumentation bezüglich dieser Thematik noch deutlich ausbaufähig ist.

Danke dir für den Hinweis :slight_smile:

Cheers