触发时间监听 所在目录 app\Providers\EventServiceProvider.php
设置监听对象userRegistered,分配事件行为发送邮件 sendRegisterEmail
App\Events\UserRegistered
protected $listen = [
'App\Events\UserRegistered' => [
'App\Listeners\SendRegisterEmail',
],
];
php artisan event:generate 会生成app/events的
会分别在Events和listener目录中生成对应文件
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\User;
class UserRegistered extends Event
{
use SerializesModels;
public $user;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(User $user)
{
$this->user=$user;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
App\Listeners\SendRegisterEmail
<?php
namespace App\Listeners;
use App\User;
use App\Mailer\UserMailer;
use App\Events\Event;
use App\Events\UserRegistered;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendRegisterEmail
{
/**
* Create the event listener.
*
* @return void
*/
public $mailer;
public function __construct(UserMailer $mailer)
{
$this->mailer=$mailer;
}
/**
* Handle the event.
*
* @param UserRegistered $event
* @return void
*/
public function handle(UserRegistered $event)
{
//dd($event->user->email);
$this->mailer->RegisterSendToEamil($event->user);
//dd($this->mailer->RegisterSendToEamil($event->user));
}
}
在控制器发送邮件的方法中
public function postRegister(Requests\UserRegisterRequest $request){ $data=[ 'token'=>str_random(48), 'avator'=>'/img/default-avator.png', ]; $user=User::create(array_merge($request->all(),$data)); event(new UserRegistered($user)); //return redirect('/'); return redirect('user/register')->with('message','注册成功,请到邮箱中激活您的账户!'); }
使用国内的sendcloud发送平台
新建Mailer文件,一个Mailer.php类和一个子类userMalier.php继承父类Mailer.php
Mailer.php
<?php
namespace App\Mailer;
class Mailer{
protected $url = 'http://api.sendcloud.net/apiv2/mail/sendtemplate';
public function sendTo($user, $subject, $view, $data = [])
{
$vars = json_encode(['to' => [$user->email], 'sub' => $data]);
$param = [
'apiUser' => env('SENDCLOUD_API_USER'), # 使用api_user和api_key进行验证
'apiKey' => env('SENDCLOUD_API_KEY'),
'from' => config('mail')['from']['address'], # 发信人,用正确邮件地址替代
'fromName' => config('mail')['from']['name'],
'xsmtpapi' => $vars,
'subject' => $subject,
'templateInvokeName' => $view,
'respEmailId' => 'true'
];
$sendData = http_build_query($param);
$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => $sendData
]];
$context = stream_context_create($options);
$result = file_get_contents($this->url, FILE_TEXT, $context);
return $result;
}
}
?>
userMalier.php
<?php
namespace App\Mailer;
class UserMailer extends Mailer{
public function RegisterSendToEamil($user){
$subject = '注册激活邮件';
$view = 'register_send_email';
$data = ['%name%' => [$user->name],'%token%' => [$user->token]];
//$data=[];
$this->sendTo($user, $subject, $view, $data);
}
}
?>