在模型本身中添加yii2事件处理程序

在模型本身中添加yii2事件处理程序,yii,yii2,swiftmailer,Yii,Yii2,Swiftmailer,在我的用户模型中,我需要在插入新记录后发送电子邮件。我迫不及待地想发电子邮件,因为它花了太多时间。所以我尝试在模型本身内部使用事件处理程序 class User extends ActiveRecord { public function events() { return [ User::EVENT_AFTER_INSERT => [$this, 'sendEmail'] ]; } public f

在我的用户模型中,我需要在插入新记录后发送电子邮件。我迫不及待地想发电子邮件,因为它花了太多时间。所以我尝试在模型本身内部使用事件处理程序

class User extends ActiveRecord {
    public function events()
    {
        return [
            User::EVENT_AFTER_INSERT => [$this, 'sendEmail']
        ];
    }
     public function sendEmail(){
        Yii::$app->mailer->compose()
            ->setTo($this->email)
            ->setFrom(['mail address' => 'name'])
            ->setSubject('Verify your Email')
            ->setHtmlBody('<p>Please click on the <a href="'.Yii::$app->request->hostInfo.'/'.Yii::$app->params['frontEndUrl'].'#/verify-email/'
                .$this->emailToken.
                '">link</a> to verify your email</p>')
            ->send();
    }
}
类用户扩展ActiveRecord{
公共活动()
{
返回[
User::EVENT\u AFTER\u INSERT=>[$this,'sendmail']
];
}
公共函数sendmail(){
Yii::$app->mailer->compose()
->setTo($this->email)
->setFrom(['mail address'=>'name']))
->setSubject('验证您的电子邮件')
->setHtmlBody(“请单击以验证您的电子邮件”
->send();
}
}

但是它没有任何作用?

您可能来自javascript背景,但PHP中的事件不是这样工作的(在javascript中是这样的)。如果你提出一个事件,它会被抓住,但不会在一个新的过程中。即使你想做什么就做什么,它仍然会等待电子邮件发送出去


解决方案是使用某种队列,最简单的方法是在数据库的“email”表中插入一条记录,然后继续。您可以使用cronjob处理电子邮件表并发送实际电子邮件。

这是电子邮件验证,因此我无法将其设置为CRON job。除了像mandrill这样的swift邮件,还有其他发送电子邮件的方法吗?当然你可以作为cron发送。技术/逻辑方面的考虑因素是什么?当然你也可以用mandrill我以前用过这个。你能给我一个设置cron作业的例子吗?我如何在插入新用户记录时立即发送电子邮件。这两个词“立即发送电子邮件”永远不应该同时出现。根据定义,电子邮件不是即时的。如果发送电子邮件花费太多时间,可以使用mandril或在“email”表中插入电子邮件内容。每分钟制作一个cronjob进程,用于发送电子邮件。cronjob可能很慢,但请确保它不会超过1分钟。如果您在使用mandril之前从未这样做过,它将为您节省cronjob本身带来的问题。现在要花钱了,如果这是个问题,试着找到另一个免费的替代品。