如何在 Laravel 5.5 中监听 messageSent 事件

Him*_*kar 6 php laravel laravel-5.5

嗨,我是 Laravel 事件和侦听器的初学者。所以请解释我如何实现这一目标:

目的 :

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

我的理解 :

Laravel 有内置事件 Illuminate\Mail\Events\MessageSent发送电子邮件后触发,我必须编写一个侦听器来侦听该事件。

我做了什么 :

发送电子邮件:

Mail::to($receiverAddress)->send(new SendNewUserPassword($content));
Run Code Online (Sandbox Code Playgroud)

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

为了监听 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;
    }
}  
Run Code Online (Sandbox Code Playgroud)

注册事件:

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

    'Illuminate\Mail\Events\MessageSent' => [
        'App\Listeners\LogSentMessage',
    ],
];
Run Code Online (Sandbox Code Playgroud)

在控制器中:

event(new MessageSent())  
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*col 7

您可以将数据从控制器传递到可邮寄的数据,然后从可邮寄的数据传递到侦听器

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

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

在你的控制器中

将模型传递给您的 Mailable 构造函数

$send_order = SendOrder::create(['status' => 'received', 'email' => 'foo@example.com']);

Mail::to($receiverAddress)->send(new SendNewMail($send_order));
Run Code Online (Sandbox Code Playgroud)

在可邮寄的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

     }
}
Run Code Online (Sandbox Code Playgroud)

创建监听器

在文件 app/Providers/EventServiceProvider.php 中注册事件和监听器

protected $listen = 
    'Illuminate\Mail\Events\MessageSent' => [
        'App\Listeners\LogSentMessage',
    ],
];
Run Code Online (Sandbox Code Playgroud)

现在执行命令:

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']);
}
Run Code Online (Sandbox Code Playgroud)


小智 2

在您EventServiceProvider添加事件和侦听器

protected $listen = [
       'Illuminate\Notifications\Events\NotificationSent' => [
       'App\Listeners\YourListenerClass',
    ],
]; 
Run Code Online (Sandbox Code Playgroud)

并在 YourListnerClass 中

public function handle(NotificationSent $event)
{

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

}
Run Code Online (Sandbox Code Playgroud)