[GELÖST] Subscriber: Variable in mehreren Events nutzen

Hallo zusammen,

 

ich habe einen Subscriber, über den ich mich auf 2 Events registriere.

Durch onCheckoutPostDispatch lese ich Daten aus einem Formular (Post-Request) aus, welches bei der Bestätigung der Bestellung übergeben wird. Aktuell speichere ich die relevanten Daten in der Klassenvariable $this->mail.

In onBeforeSendOrderConfirmationMail (welche im Bestellprozess kurz später aufgerufen wird) möchte ich diese Daten nun weiterverarbeiten. Leider ist an dieser Stelle $this->mail nie ein Wert zugewiesen. Ich vermute, dass hier bereits auf einer neuen Objektinstanz gearbeitet wird.

 

class Frontend implements SubscriberInterface
{
    private $mail;

    public static function getSubscribedEvents()
    {
        return array(
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Checkout' => 'onCheckoutPostDispatch',
            'Shopware_Modules_Order_SendMail_Filter' => 'onBeforeSendOrderConfirmationMail'
        );
    }

    public function onCheckoutPostDispatch(\Enlight_Event_EventArgs $args)
    {
        /** @var \Shopware_Controllers_Frontend_Checkout $subject */
        $subject = $args->getSubject();
        $request = $subject->Request();

        if ($request->getActionName() !== 'finish') {
            return;
        }

        $postData = $request->getPost();
        $this->mail = $postData['additionalMail'];
    }

    public function onBeforeSendOrderConfirmationMail(\Enlight_Event_EventArgs $args)
    {
        $mail = $args->getReturn();
        // hier ist $this->mail nie ein Wert zugewiesen!
        if (isset($this->mail)) {
            $mail->addTo($this->mail);
        }
        return $mail;
    }
}

 

Meine Fragen:

  1. Was ist der sauberste Weg, eine Variable über mehrerer Events hinweg verfügbar zu machen?

  2. Wie kann ich als Entwickler am besten herausfinden, wann Instanzen bestimmter Klassen erzeugt werden und wie lange diese „leben“?

Beim Debuggen habe ich festgestellt, dass Shopware_Modules_Order_SendMail_Filter vor Enlight_Controller_Action_PostDispatchSecure_Frontend_Checkout aufgerufen wird.

Ich habe nun Enlight_Controller_Action_ PostDispatchSecure _Frontend_Checkout durch Enlight_Controller_Action_ PreDispatch _Frontend_Checkout ersetzt. Jetzt funktioniert alles.

 

@suud schrieb:

Meine Fragen:

  1. Was ist der sauberste Weg, eine Variable über mehrerer Events hinweg verfügbar zu machen?

  2. Wie kann ich als Entwickler am besten herausfinden, wann Instanzen bestimmter Klassen erzeugt werden und wie lange diese „leben“?

Meine Antworten:

  1. Mit Klassenvariablen, wenn möglich.

  2. Durch Debugging.

________________________________________________________________________________

Falls dir das weitergeholfen hat, würde ich mich über ein Danke freuen!

Danke :slight_smile: