Events - Listener (CustomerRegisterEvent)

Hallo Shopware Community,

zwar bin ich dabei ein EventListener Plugin zu schreiben. So weit klappt alles auch und bin jetzt dabei nach und nach die Events zu suchen die ich brauche.

Gibt es einen debug mode um zu sehen welches Event getriggered wird? z.B. suche ich gerade ein Event was getriggered wird wenn man seine Bestellungen /account/order aufruft.

vendor/shopware/storefront/Page/Account/Order/AccountOrderPageLoader.php

$this->eventDispatcher->dispatch(
   new AccountOrderPageLoadedEvent($page, $salesChannelContext, $request)
);

Die Events die ich laut Documentation abfangen kann sind solche ORDER_LINE_ITEM_LOADED_EVENT

Daher meine Frage wie ich an solche Events (wenn überhaupt vorhanden) dran komme.

Regards

Ich mach mal ein doppelpost, da ich nun eine ähnliche Frage habe. Erster Post bleibt erstmal Baustelle 1.

Mit dem Event

 MAPPING\_CUSTOMER\_PROFILE\_SAVE

Bekomme ich zwar den $context->getContext() durch das MappingEvent. Ist es dennoch möglich irgendwie an die uuid zu kommen? Ich weiß, wenn das Event getriggered wird, wird zusätzlich auch 

 CUSTOMER\_WRITTEN\_EVENT

getriggerd, wo dann die uuid drin steht. Hätte dann aber kein Bezug mehr, dass es geupdated worden ist.

 

Grüße

Hat sich bis jetzt niemand so richtig mit den Thema Events befasst?

Das Thema Events beschäftigt mich gerade auch. Ich bin mir jetzt nicht sicher, ob wir an ähnlichen Themen arbeiten.

Ich musste zumindest das ProductListing ausbauen und habe mich dafür über einen Subscriber auf das ProductListingResultEvent gehookt. Die Klasse dafür liegt unter: platform/src/Core/Content/Product/Events/ProductListingResultEvent.php

Ich würde dein Event irgendwo hier vermuten: src/Core/Checkout/Customer/Event

Ich hoffe, ich konnte dir etwas weiterhelfen.

@reisueber schrieb:

Das Thema Events beschäftigt mich gerade auch. Ich bin mir jetzt nicht sicher, ob wir an ähnlichen Themen arbeiten.

Ich musste zumindest das ProductListing ausbauen und habe mich dafür über einen Subscriber auf das ProductListingResultEvent gehookt. Die Klasse dafür liegt unter: platform/src/Core/Content/Product/Events/ProductListingResultEvent.php

Ich würde dein Event irgendwo hier vermuten: src/Core/Checkout/Customer/Event

Ich hoffe, ich konnte dir etwas weiterhelfen.

Immerhin mal eine Antwort :wink: Naja die Customer Events (vendor/shopware/core/Checkout/Customer/CustomerEvents.php) die alle vorhanden sind, triggern nicht das richtige was ich bräuchte. Wie oben schon steht, wird zwar AccountOrderPageLoadedEvent aufgerufen, aber ohne const (extra function call) um dort zu hooken.

 

Was mich auch wundert, dass Event 

 vendor/shopware/core/Checkout/Customer/Event/CustomerRegisterEvent.php

wird irgendwie nicht ausgeführt. In der getSubscribedEvents Funktion habe ich Testweiße die selben Events dort drin.

CustomerRegisterEvent::class => 'onCustomerRegisterEvent',
CustomerEvents::CUSTOMER_REGISTER_EVENT => 'onCustomerRegisterEvent',

Obwohl in der AccountRegistrationService.php wenn kein DoubleOptInRegistration() vorhanden ist, er das event->dispatch, wird es nicht abgefangen. Im RegisterController bei der register() Funktion (vendor/shopware/storefront/Controller/RegisterController.php) ist auch kein event->dispatch drin.

Ich glaube ich habe es gelöst bekommen. In der services.xml  war nur 

;

aber ich glaube

hat einfach nur gefehlt. Jetzt kommen zumindest die CustomerRegister / Login Events an.

@CallMeAlex schrieb:

Ich glaube ich habe es gelöst bekommen. In der services.xml  war nur 

;

aber ich glaube

hat einfach nur gefehlt. Jetzt kommen zumindest die CustomerRegister / Login Events an.

Was genau hast du gemacht? Meine services.xml sieht so aus: 

Meine Subscriber Klasse so: 

use Shopware\Core\Checkout\Customer\CustomerEvents;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class MySubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return[
             CustomerEvents:: CUSTOMER_REGISTER_EVENT => 'customerRegistered',
			 CustomerRegisterEvent::class => 'customerRegistered',
        ];
    }

    public function customerRegistered(EntityLoadedEvent $event)
    {
        // Do something
        // E.g. work with the loaded entities: $event->getEntities()
        XXXXXXXXX
    }
}

Die customerRegistered Funktion wird aber nicht ausgeführt. Bin mir bei der service.xml aber nicht ganz sicher. Hatte dort die Tags schon im einem Service, anstatt 2 services mit je einem Tag, aber gleiches Resultat. Funktion wird nicht ausgeführt

@Introser‍ meine services.xml schaut so aus:

Sofern dir das irgendwie weiter hilft.

 

@Introser‍, bist du hier irgendwie weitergekommen? Denn ich habe das gleiche Problem.

Ich verwende bereits an verschiedenen Orten EventListeners und es funktioniert einwandfrei. Allerdings benötige ich nun einen Listener für CartEvents::CHECKOUT_ORDER_PLACED und in diesem Fall wird der Listener nicht ausgeführt. Ich habe keine Ahnung wieso.

mein service.xml sieht wie folgt aus:

  

im APP_ENV=dev–Mode habt ihr doch eine Toolbar, in der ihr euch alle Events, Datenbankabfragen etc pp ansehen könnt.

In der Toolbar sehe ich nur die Called Listeners (und da ist meiner nicht dabei), nicht aber die Dispatched Events, oder such ich am falschen Ort im Symfony Profiler?

Wie gesagt erscheint mein Listener, bzw. Subscriber nicht in der Liste der “Called Listeners”, ein die() direkt vor dem Event Dispatch im Shopware Code greift aber…

Ich habe es geschafft.
In meinem service.xml habe ich den Listener nun so eingetragen

Nun greift der Listener. Vielleicht hilft dies den anderen ja auch weiter…

@troxs schrieb:

@Introser‍, bist du hier irgendwie weitergekommen? Denn ich habe das gleiche Problem.

Ich verwende bereits an verschiedenen Orten EventListeners und es funktioniert einwandfrei. Allerdings benötige ich nun einen Listener für CartEvents::CHECKOUT_ORDER_PLACED und in diesem Fall wird der Listener nicht ausgeführt. Ich habe keine Ahnung wieso.

mein service.xml sieht wie folgt aus:

 

Hättest auch das Event nehmen können

CheckoutOrderPlacedEvent::class => 'onCheckoutOrderPlacedEvent',

Damit arbeite ich & es klappt einwandfrei. Oder dieses:

OrderEvents::ORDER_WRITTEN_EVENT => 'onOrderEventsWritten',

das normale WRITTEN_EVENT was sogut wie überall ist.

Hi @troxs,

kannst du deine XML bitte nochmal senden? Leider sieht man die nicht mehr, auch bei mir will er das CUSTOMER_REGISTER_EVENT einfach nicht abfeuern.

Danke und Gruß

Hi @CallMeAlex,

kannst du bitte nochmal schreiben was genau du gemacht hast?

Danke und Gruß

Falls noch jemand das Problem haben sollte, so funktionierts:

public static function getSubscribedEvents(): array
    {

        return [
            CustomerRegisterEvent::class => 'onRegister'
        ];
    }

public function onRegister(CustomerRegisterEvent $event)
    {
        $this->logger->info("Customer register", ["id" => $event->getCustomerId()]);
    }
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="RegisterChangeClass\Listener\RegisterListener">
            <argument type="service" id="logger" />
            <argument type="service" id="customer.repository" />
            <tag name="kernel.event_subscriber" />
        </service>
        
    </services>
</container>
1 „Gefällt mir“