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