【问题标题】:Laravel notify about ad expirationLaravel 通知广告到期
【发布时间】:2021-07-21 20:23:13
【问题描述】:

我的用户可以发布广告,然后用他们购买的代币进行宣传。 对于每种类型的促销,我都有 pro_until、vip_until 等列。

它们是时间戳并保存到秒。 当用户将他的广告宣传为 vip 3 天时,我将 now()->addDays(3) 保存到 vip_until 列。

那么问题出在哪里: 我的用户需要有一个带有通知的仪表板,其中一些是关于广告促销到期的通知。类似于 “22/03/2020 15:30:20 - 您的广告 111 的 VIP 已过期”

以下是我尝试/思考过的事情以及它们的效果:

Cron 作业:

我可以每分钟运行一次 cron 作业并检查过期列 $ad->vip_until->lt(now())

问题是:我如何只通知这个过期广告一次?

我无法检查 now(){type}_until 之间的完全匹配,因为 cron 每分钟执行一次,并且我将 {type}_until 列保持在精确的秒数,所以完全有可能没有总匹配。

延迟通知:

我尝试在创建促销https://laravel.com/docs/8.x/notifications#queueing-notifications时对过期通知进行排队。

我添加了->delay() 回调

实现了 ShouldQueue 接口

使用了 Queueable 特征

添加了队列工作者

但通知是立即推送的。

    $delay = null;

    if ($request->type == 'pro') {
        $delay = $ad->promotePro($request->days);
    }
    if ($request->type == 'top') {
        $delay = $ad->promoteTop($request->days);
    }
    if ($request->type == 'vip') {
        $delay = $ad->promoteVip($request->days);
    }

    Auth::user()->payed -= $price;
    Auth::user()->save();

    if ($delay) {
        Auth::user()->notify((new AdPromotionEndedNotification($ad, $request->type))->delay($delay));
    }

【问题讨论】:

  • 这个问题有很多可能的解决方案,并不适合常见问题解答格式。
  • “我的用户需要一个带有通知的仪表板,其中一些是关于广告促销到期的通知。”所以你想在某个页面列出广告促销到期。在这种情况下,您只能获取将在未来 X 天到期的广告并在此仪表板中显示它们。如果您想发送电子邮件或其他通知,您可以在表格中添加一个标志,该标志将标记通知已发送并且您不会再次发送。
  • @EmilGeorgiev 我只需要在广告过期后展示它们。我显示的消息是“您的广告 XXXX 的 VIP 已过期。”
  • 你确定你的环境没有设置为同步?

标签: php laravel scheduled-tasks


【解决方案1】:

我不明白为什么需要 cron 作业来显示过期广告列表?或者您需要其他内容,例如具有已读/未读状态的 Facebook 通知?

如果您想要像 Facebook 这样的通知 - 然后创建一个分配给用户的通知的新表并将其显示给用户

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2021-04-17
    • 2023-03-11
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2021-11-19
    相关资源
    最近更新 更多