【问题标题】:Add yii2 event handler in model itself在模型本身中添加 yii2 事件处理程序
【发布时间】:2017-02-06 04:33:31
【问题描述】:

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

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();
    }
}

但它没有任何想法?

【问题讨论】:

    标签: yii yii2 swiftmailer


    【解决方案1】:

    您可能来自 javascript 背景,但 PHP 中的事件不是这样工作的(在 Javascript 中是这样)。如果您提出一个事件,它将被捕获,但不会在新进程中。即使你设法做你想做的事,它仍然会等待电子邮件发送出去。

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

    【讨论】:

    • 这是一个电子邮件验证,所以我无法将其设置为 CRON 作业。除了快速邮件,还有其他方法可以发送电子邮件,比如 mandrill 吗?
    • 当然你可以将它作为一个 cron 发送。为什么你不能这样做的技术/逻辑考虑是什么?当然你也可以使用山魈,我过去用过这个。 packagist.org/packages/nickcv/yii2-mandrill
    • 你能给我一个设置cron作业的例子吗,当插入新用户记录时如何立即发送电子邮件。
    • 这两个词“立即发送电子邮件”不应该放在一起。根据定义,电子邮件不是即时的。如果发送电子邮件需要太多时间,请使用 mandril 或将电子邮件的内容插入“电子邮件”表中。每分钟创建一个该表的 cronjob 进程以发送电子邮件。 cronjob 可能会很慢,只要确保它不会超过 1 分钟。如果您在使用 mandril 之前从未这样做过,它将为您节省数天的 cronjob 本身会引发的问题。现在它要花钱,如果这是一个问题,请尝试寻找另一个免费的替代品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多