Как отправить уведомление на основе даты в laravel? - PullRequest
4 голосов
/ 12 июля 2020

Я пытаюсь заставить свой бэкэнд отправлять уведомление каждый день, который приближается к указанной дате.

Например, если мой пользователь добавляет дату «13-07-2020», он должен получить уведомление "ваш крайний срок в 1 день!" (сегодня 12).

Я читал в документации Laravel раздел о «Планировании задач», но не уверен, как это реализовать таким образом, каждый пользователь будет получать собственные уведомления.

Как это возможно сделать sh? В документации говорится: «Планировщик команд Laravel позволяет вам плавно и выразительно определять расписание команд внутри самого Laravel». Итак, это заставляет меня поверить, что это только для команд.

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

«Планирование задач» - это означает, что какое-то действие выполняет cron.

Я не знаю, что вы имеете в виду под «уведомлением». Вы имеете в виду в приложении или по электронной почте?

  1. уведомление в приложении - вы создаете запланированное действие, куда вставляете данные в таблицу уведомлений. Таблица может выглядеть так: id, user_id, task_id, day
  2. email - вы отправляете электронные письма пользователям в этом запланированном действии.
1 голос
/ 14 июля 2020

Я бы подошел к этому с помощью Laravel команд.

Создание команды

Чтобы создать команду, вы можете запустить:

php artisan make:command NotifyUsers

Это создает команду NotifyUsers. В функции handle() команды вы можете отправить сообщение каждому пользователю, у которого установлен крайний срок.

public function handle() {
  $users = User::whereNotNull('deadline_date')->get();
  foreach($users as $user) {
    $diffInDays = $user->deadline_date->diff(Carbon::now())->days;

    $user->notify("Your deadline is in $diffInDays day!");
  }
}

Я установил подпись команды следующим образом:

protected $signature = 'users:notify';

Это означает, что вы можете вызвать команду, запустив

php artisan users:notify

Планирование команды

В классе Console/Kernel.php вы можете запланировать выполнение команды. Сначала вы должны добавить его в массив $commands:

protected $commands = [
  NotifyUsers::class,
];

А в функции schedule() вы можете запланировать выполнение команды один раз в день.

protected function schedule(Schedule $schedule) {
  // Here you can execute the command once every day
  $schedule->command('users:notify')->dailyAt('14:00');
}
0 голосов
/ 14 июля 2020

Поскольку вопрос не технический, мой ответ также не будет содержать кода.

Создайте команду планировщика, которая запускает «довольно часто» (например, каждые 5 минут или около того). Цель этой команды - постоянно перебирать все ресурсы с датой, указанной вашими пользователями, и выбирать те, которые соответствуют правилу , например:

Дата записи в будущем минус крайний срок = now()

Другими словами, вы постоянно l oop просматриваете все записи, предшествующие крайнему сроку, и выбираете те, которые соответствуют дате крайнего срока . После выбора не забудьте пометить их как «выполненные» после выполнения бизнес-логи c, чтобы запланированная команда не выбрала их снова. Этого можно добиться с помощью дополнительного логического флага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...