2015-01-06 17 views
5

Czy istnieje sposób użycia klasy "Event" Laravel do uruchomienia kodu przed wysłaniem każdego e-maila? Chciałbym również możliwość anulowania Mail::send();.Laravel Mail Listener (przed wysłaniem - możliwość anulowania)

Oczywiście mogę to zrobić, zanim wyślę e-mail:

Event::fire('email.beforeSend'); 

A potem mogę słuchać w ten sposób:

Event::listen('email.beforeSend', function() 
{ 
    //my code here 
}); 

Problemem jest to, że muszę pamiętać, aby uruchomić Event::fire() którego nie chciałbym robić. W moim przypadku podrzucam adres e-mail na listę rezygnacji z subskrypcji, aby upewnić się, że nie wysyłam spamu.

Odpowiedz

4

Laravel's Mail klasy odpala mailer.sending w ramach procesu wysyłania.

protected function sendSwiftMessage($message) 
{ 
    if ($this->events) 
    { 
     $this->events->fire('mailer.sending', array($message)); 
    } 

    if (! $this->pretending) 
    { 
     $this->swift->send($message, $this->failedRecipients); 
    } 
    elseif (isset($this->logger)) 
    { 
     $this->logMessage($message); 
    } 
} 

Można by złapać tego zdarzenia i dostosować obiekt $message, czy można prawdopodobnie zapobiec wysyłaniu przez wywołanie Mail::pretend(); wewnątrz programu obsługi zdarzeń.

+0

Interesujące. Więc mój słuchacz będzie wyglądał jak "Event :: listen" ("mailer.sending", function() {}); '? Nie jestem zaznajomiony z 'Mail :: pretend();' Zgaduję, że robi to samo co ''udaje' => false' w config. Zaskoczę to i wrócę do ciebie. – sterfry68

+0

Myślę, że 'Mail :: pretend();" będzie "udawać", że wyśle ​​kolejną wiadomość e-mail, ale nie anuluje bieżącej wiadomości e-mail. Czy mam rację? http://laravel.com/docs/4.2/mail#mail-and-local- development – sterfry68

+0

Włączy się tryb "udawania". Następne wiersze w teście 'sendSwiftMessage' dla tego trybu i pomiń wysyłkę. – ceejayoz

Powiązane problemy