suudsuud MemberComments: 3 Received thanks: 1 Member since: August 2017 edited August 2017

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"?

Comments

  • suudsuud MemberComments: 3 Received thanks: 1 edited August 2017 Member since: August 2017

    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!

  • SgoftwareSgoftware MemberComments: 2 Received thanks: 0 Member since: November 2019

    Danke :)

Sign In or Register to comment.