laravel 发邮件前如何先往数据库里写入发信记录,发信后改这个记录的状态

2019-04-22 14:59:39 +08:00
 solaro

LARAVEL 5.6

控制器代码

目前我是用这种写法,send 之前先创建一条记录,然后把记录自增 ID 传入到 这个 activeUser 里:

$logId = Helpers::addEmailLog($request->username, '注册激活', '请求地址:' . $activeUserUrl);
Mail::to($request->username)->send(new activeUser($logId, $activeUserUrl));

activeUser 代码

抽象于 ShouldQueue,所以其实是走队列发送的邮件,我是想把 $logId = Helpers::addEmailLog($request->username, '注册激活', '请求地址:' . $activeUserUrl); 这行代码给加入到下面这个 build 里,但是貌似行不通,不晓得有什么办法实现?反正就是想把上面个两行控制器代码简化成一行

<?php

namespace App\Mail;

use App\Http\Models\EmailLog;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class activeUser extends Mailable implements ShouldQueue
{
   use Queueable, SerializesModels;

   protected $id; // 邮件记录 ID
   protected $activeUserUrl; // 激活用户 URL

   public function __construct($id, $activeUserUrl)
   {
      $this->id = $id;
      $this->activeUserUrl = $activeUserUrl;
   }

    public function build()
    {
       return $this->view('emails.activeUser')->subject('激活账号')->with([
          'activeUserUrl' => $this->activeUserUrl
       ]);
    }

    // 发件失败处理
    public function failed(\Exception $e)
    {
       EmailLog::query()->where('id', $this->id)->update(['status' => -1, 'error' => $e->getMessage()]);
    }
}
2956 次点击
所在节点    PHP
1 条回复
sandersyao
2019-04-22 22:01:39 +08:00
我不太理解业务逻辑,但觉得应该这样处理:

1.让控制器去创建用户;
2. dispatch 一个 job 去发邮件;

这样看创建用户的逻辑不应该写在任务里,应该保留在控制器里;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/557521

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX