【问题标题】:Laravel skip sending mail based on conditionsLaravel 根据条件跳过发送邮件
【发布时间】:2019-11-26 02:35:44
【问题描述】:

我在我的控制器功能中循环访问用户并向每个用户发送电子邮件,但有一个特殊用户有时会出现在不应该接收电子邮件的列表中。

如果是那个用户,我想添加一个if 语句以跳过该循环迭代,但是当我添加returnreturn null 等时,或者在可邮寄类中的if/else 中什么都没有我得到的构建函数

InvalidArgumentException
Invalid view.

我可以在控制器中添加条件,我相信这会很好,除非我在我的控制器的整个负载中都有这些电子邮件,所以会多次编写条件。如果我能把它放到一个中心位置(而且我知道的只有可邮寄的类),那么我可以写一次。

编辑:已请求循环代码,因此在下面添加,但这只是我的控制器中的许多电子邮件循环之一,所以不是我想添加条件的地方。

        $objNotification = new \stdClass();
        $objNotification->message_body = "stuff";
        $user_ids = DB::select('select user_id from users_to_things where thing_id = ?', [$thing->id]);
        foreach($user_ids as $user_id) {
            $user = User::find($user_id->user_id);
            $objNotification->receiver = $user->name;
            Mail::to($user->email)->send(new NotificationEmail($objNotification));
        }

这是我的可邮寄类的构建函数(如果可能的话,我想在其中添加条件):

public function build()
{
    if($this->notification->receiver == 'the special user') {
        return;
    } else {
        return $this->from('somebody@somewhere.com', 'Sender Name')
                    ->subject('some subject')
                    ->view('emails.notification')
                    ->text('emails.notification_plain');
    }
}

【问题讨论】:

  • 请告诉我们您正在使用的循环。如果您不向我们展示您的代码,我们将无法帮助您。
  • 没问题@Jerodev,我已经添加了这个和可邮寄的构建功能(我想编辑)。

标签: laravel email model-view-controller laravel-5.7


【解决方案1】:

你想要的会与单一职责原则相冲突。该课程仅假设发送电子邮件。

您的可邮寄类中的build() 返回错误,因为它希望您为您的邮件返回一条消息(主题、正文、模板或view 等)。

1.) 也许您可以在您的情况下断言假邮件;

2.) 在电子邮件类中创建一个函数

public function needSend($mail)
{
    ... loads of conditions
    return (condition) ? true : false;
}

然后

if ($mail->needSend($mail)) {
    \Mail::send($mail);
}

3.) 或者最简单但最肮脏的方法是您可以将条件放在 Controllerfor 循环中

foreach($user_ids as $user_id) {
   $user = User::find($user_id->user_id);
   $objNotification->receiver = $user->name;
   if(condition == true) continue;
   Mail::to($user->email)->send(new NotificationEmail($objNotification));
}

您也可以在 github 上阅读此主题。 https://github.com/laravel/ideas/issues/519

【讨论】:

  • 感谢您的回答,但我认为您没有正确阅读该问题 - 我试图避免将其添加到控制器循环中,因为我有很多这样的循环,所以会写多次相同的条件。我在问是否可以在中心位置(例如可邮寄类)写一次。
  • 谢谢朱利叶斯。我是 Laravel 新手,所以对去哪里只有一个模糊的了解,但不是所有这些解决方案都需要对控制器进行编辑,因此每个用户的电子邮件循环都必须进行编辑吗?
  • 谢谢,我确实看到了那篇帖子(看起来很完美),但对回复是意识形态的批评而不是实际的反应感到失望(而不想多次重写相同的代码的愿望很明显)价值!)。
【解决方案2】:

使用通知类,检查您的条件,如禁止列表或运行时条件。返回一个空数组,它会退出。

/**
 * Get the notification's delivery channels.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function via($notifiable)
{
    return $notifiable->notificationSuppression()->exists() ? [] : ['mail'];
}

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多