如何在laravel 5.5中监听messageSent事件

时间:2017-12-06 22:02:24

标签: php laravel laravel-5.5

您好,我是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,所以如果发送邮件成功/失败我想知道。

4 个答案:

答案 0 :(得分:2)

CREATE TABLE `client` ( `id` int(10) UNSIGNED NOT NULL, `name` varchar(50) NOT NULL, `phone` varchar(15) NOT NULL, `city_id` int(10) UNSIGNED NOT NULL, `address` varchar(100) DEFAULT NULL, `cpf` varchar(14) DEFAULT NULL, `rg` varchar(15) DEFAULT NULL, `obs` varchar(100) DEFAULT NULL, `company_id` int(10) UNSIGNED NOT NULL, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `client` ADD PRIMARY KEY (`id`), ADD KEY `city_id` (`city_id`), ADD KEY `company_id` (`company_id`); ALTER TABLE `client` ADD FULLTEXT KEY `search` (`name`,`phone`,`address`,`cpf`,`rg`,`obs`); ALTER TABLE `client` ADD FULLTEXT KEY `search_basic` (`name`); ALTER TABLE `client` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=613; ALTER TABLE `client` ADD CONSTRAINT `client-city_id` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION, ADD CONSTRAINT `client-company_id` FOREIGN KEY (`company_id`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION; 添加您的活动和听众

EventServiceProvider

并在YourListnerClass

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

答案 1 :(得分:1)

执行php php artisan event:generate将为您生成App\Listeners\LogSentMessage

编辑文件,例如:

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

答案 2 :(得分:1)

我一直被困住,一直试图让我的 EventServiceProvider 将 Illuminate\Mail\MessageSent 事件注册到本地侦听器。每次我尝试做的时候 php工匠事件:生成 我会得到

Your application doesn't have any events matching the given criteria.

我终于发现我的 EventService 提供者正在使用

use Illuminate\Support\ServiceProvider;

当我切换到使用时

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

活动已正确注册!也许这会对某人有所帮助。

答案 3 :(得分:0)

您可以将数据从控制器传递到可邮件对象,然后再从可邮件对象传递给侦听器

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

这是您从头开始要做的

在您的控制器中

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

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

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

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

     }
}

创建侦听器

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

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

现在执行命令:

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']);
}