如何在laravel 5.5中监听messageSent事件

问题描述 投票:3回答:3

嗨,我是laravel活动和听众的初学者。所以请解释我如何实现这个目标:

目标 :

发送电子邮件给用户。并知道是否发送电子邮件。

我的理解 :

Laravel在发送电子邮件后内置了活动Illuminate\Mail\Events\MessageSent,我必须写一个听众来听取这个事件。

我做了什么 :

发送电子邮件:

Mail::to($receiverAddress)->send(new SendNewUserPassword($content));

这工作正常。能够成功向用户发送电子邮件。

要监听messageSent事件,我创建了这个监听器:

<?php

namespace App\Listeners;

use Illuminate\Mail\Events\MessageSent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class LogSentMessage
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  MessageSent  $event
     * @return void
     */
    public function handle(MessageSent $event)
    {
        return $event->message;
    }
}  

注册活动:

protected $listen = [
    'App\Events\Event' => [
        'App\Listeners\EventListener',
    ],

    'Illuminate\Mail\Events\MessageSent' => [
        'App\Listeners\LogSentMessage',
    ],
];

在控制器中:

event(new MessageSent())  

请指导我如何从控制器返回Listener中处理的消息。如果我的上述方法是错误的,请解释我如何实现它。这是我用于api,所以如果发送邮件是成功/失败我想知道。

php laravel laravel-5.5
3个回答
2
投票

在你的EventServiceProvider中添加你的活动和听众

protected $listen = [
       'Illuminate\Notifications\Events\NotificationSent' => [
       'App\Listeners\YourListenerClass',
    ],
]; 

在YourListnerClass中

public function handle(NotificationSent $event)
{

 //access your $event data here 
 //which includes notification details too

}

1
投票

做php php artisan event:generate会为你生成App\Listeners\LogSentMessage

编辑文件例如:

public function handle(MessageSent $event)
{
    dd($event->message->getBody(), $event->message->toString());
}

0
投票

您可以将数据从控制器传递到mailable,然后从mailable传递给侦听器

例如,我有一个名为SendOrder的模型,用于跟踪电子邮件的状态,因此我将此模型从控制器传递给侦听器

这是你必须从头开始做的事情

在你的控制器中

将模型传递给Mailable构造函数

$send_order = SendOrder::create(['status' => 'received', 'email' => '[email protected]']);

Mail::to($receiverAddress)->send(new SendNewMail($send_order));

在Mailable SendNewMail

Mailable类有一个方法withSwiftMessage(),您可以使用它来存储稍后可以从侦听器访问的变量/对象。

我们将创建一个构造函数,将模型传递给build()方法,我们可以执行withSwiftMessage()以便以后存储它。

use App\SendOrder;

class SendNewMail extends Mailable
{
     protected $send_order;

     public function __construct( SendOrder $send_order )
     {
         $this->send_order = $send_order;
     }
     public function build()
     {
         $send_order = $this->send_order;
         $this->withSwiftMessage(function ($message) use($send_order) {
               $message->send_order = $send_order;
         });

         // Do more stuffs

     }
}

创建监听器

Register the event and listener in the file app/Providers/EventServiceProvider.php

protected $listen = 
    'Illuminate\Mail\Events\MessageSent' => [
        'App\Listeners\LogSentMessage',
    ],
];

Now execute the command:

php artisan event:generate

这将自动生成新的侦听器app \ Listeners \ LogSentMessage,其模板代码已连接到内置事件Illuminate \ Mail \ Events \ MessageSent

在你的听众LogSentMessage

您可以通过以下方式访问模型:

public function handle(MessageSent $event)
{
    $send_order = $event->message->send_order;
    $send_order->update(['status' => 'sent']);
}
© www.soinside.com 2019 - 2024. All rights reserved.