嗨,我是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,所以如果发送邮件是成功/失败我想知道。
在你的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
}
做php php artisan event:generate
会为你生成App\Listeners\LogSentMessage
。
编辑文件例如:
public function handle(MessageSent $event)
{
dd($event->message->getBody(), $event->message->toString());
}
您可以将数据从控制器传递到mailable,然后从mailable传递给侦听器
例如,我有一个名为SendOrder
的模型,用于跟踪电子邮件的状态,因此我将此模型从控制器传递给侦听器
这是你必须从头开始做的事情
将模型传递给Mailable构造函数
$send_order = SendOrder::create(['status' => 'received', 'email' => '[email protected]']);
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
}
}
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']);
}