”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 集中您的通知和作业处理

集中您的通知和作业处理

发布于2024-11-08
浏览:165

Centralize your notification and job handling

为了简化在各种事件(如用户创建、密码重置等)后发送多封电子邮件通知的过程,您可以采取一些步骤来集中您的通知和作业处理。这种方法将使您的工作更轻松且更具可扩展性,而无需为每个事件创建单独的作业或通知。

简化电子邮件通知处理的策略:

  1. 使用通用电子邮件通知作业
  2. 利用事件监听器架构.
  3. 对类似通知进行分组.

1. 创建通用电子邮件通知作业

您可以创建一个单个可重用作业,将通知和用户作为参数,而不是为每个通知创建单独的作业。这样,同一个作业可以用来处理不同的通知。

通用 SendEmailNotificationJob:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Notifications\Notification;
use App\Models\User;

class SendEmailNotificationJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $user;
    public $notification;

    /**
     * Create a new job instance.
     *
     * @param  User $user
     * @param  Notification $notification
     * @return void
     */
    public function __construct(User $user, Notification $notification)
    {
        $this->user = $user;
        $this->notification = $notification;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        // Send the notification
        $this->user->notify($this->notification);
    }
}

通过此通用作业,您可以使用同一作业发送不同类型的电子邮件通知:

用法示例:

use App\Jobs\SendEmailNotificationJob;
use App\Notifications\UserWelcomeNotification;
use App\Models\User;

$user = User::find(1); // Example user

// Dispatch a welcome email notification
SendEmailNotificationJob::dispatch($user, new UserWelcomeNotification());

// Dispatch a password reset notification
SendEmailNotificationJob::dispatch($user, new PasswordResetNotification());

2. 利用事件监听器架构

Laravel 的事件监听器架构允许您根据特定事件(例如用户创建)自动触发通知和作业,而不是在每个事件后手动调度作业。

第 1 步:定义事件:

您可以定义一个事件,例如UserCreated:

php artisan make:event UserCreated

用户创建事件示例:

namespace App\Events;

use App\Models\User;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class UserCreated
{
    use Dispatchable, SerializesModels;

    public $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

第2步:创建监听器:

您可以创建一个监听器,在事件触发时发送通知:

php artisan make:listener SendUserWelcomeNotification --event=UserCreated

监听器示例:

namespace App\Listeners;

use App\Events\UserCreated;
use App\Jobs\SendEmailNotificationJob;
use App\Notifications\UserWelcomeNotification;

class SendUserWelcomeNotification
{
    public function handle(UserCreated $event)
    {
        // Dispatch the email notification job
        SendEmailNotificationJob::dispatch($event->user, new UserWelcomeNotification());
    }
}

第 3 步:创建用户时触发事件:

每当创建用户时,您都可以触发该事件,Laravel 将自动处理其余的事情:

use App\Events\UserCreated;

$user = User::create($data);
event(new UserCreated($user));

这种方法允许您将处理通知的逻辑与业务逻辑解耦,从而使系统更具可扩展性。

3. 相似通知分组

如果您有许多类似的通知(例如,欢迎电子邮件、密码重置等与用户相关的通知),您可以创建一个通知服务来集中处理所有用户通知。

通知服务示例:

namespace App\Services;

use App\Models\User;
use App\Jobs\SendEmailNotificationJob;
use App\Notifications\UserWelcomeNotification;
use App\Notifications\PasswordResetNotification;

class NotificationService
{
    public function sendUserWelcomeEmail(User $user)
    {
        SendEmailNotificationJob::dispatch($user, new UserWelcomeNotification());
    }

    public function sendPasswordResetEmail(User $user)
    {
        SendEmailNotificationJob::dispatch($user, new PasswordResetNotification());
    }

    // You can add more methods for different types of notifications
}

用法示例:

在您的控制器或事件侦听器中,您现在可以简单地调用该服务:

$notificationService = new NotificationService();
$notificationService->sendUserWelcomeEmail($user);

结论:

  • 单一作业:您可以使用通用作业(SendEmailNotificationJob)来处理不同类型的通知。
  • 事件监听器架构:利用Laravel的事件监听器系统根据系统事件自动触发通知。
  • 集中通知服务:将类似的通知分组到一个服务中,以实现更好的管理和可重用性。

这种方法有助于保持代码干燥(不要重复自己),并且当您有多个电子邮件通知要发送时,可以更轻松地进行维护。

版本声明 本文转载于:https://dev.to/msnmongare/centralize-your-notification-and-job-handling-1oid?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么在 Node.js 应用程序中连接到 MySQL 时出现“connect ECONNREFUSED”错误?
    为什么在 Node.js 应用程序中连接到 MySQL 时出现“connect ECONNREFUSED”错误?
    Node.js MySQL:解决“connect ECONNREFUSED”错误将 Node.js 应用程序部署到远程服务器时,您可以尝试建立与 MySQL 数据库的连接时遇到“connect ECONNREFUSED”错误。当 MySQL 连接参数中提供的主机配置不正确时,通常会出现此问题。在您的...
    编程 发布于2024-11-08
  • 用 Go 构建密码管理器
    用 Go 构建密码管理器
    作为一名软件开发人员,我一直对安全性和可用性的交集着迷。最近,我决定开始一个令人兴奋的项目:使用 Go 创建一个命令行密码管理器。我想与您分享这段旅程的开始,从第一次提交开始。 创世记 2023 年 11 月 27 日,我对我的项目进行了初步提交,我将其命名为“dost”(印地语中的...
    编程 发布于2024-11-08
  • 如何使用 HTML ruby​​ 元素在 HTML 中增强文本注释
    如何使用 HTML ruby​​ 元素在 HTML 中增强文本注释
    在本教程中,我们将探索如何有效地使用 HTML 元素来创建增强的文本注释。 HTML5 中的 元素旨在显示 ruby​​ 注释,这是东亚排版中常用的小文本组件。这些注释通常用于提供发音指南或附加信息。 元素对于需要在正文旁边或上方进行详细注释的文档至关重要,这使其在教育内容、语言学习资源和某些...
    编程 发布于2024-11-08
  • 如何实现跨域JavaScript的JSONP回调?
    如何实现跨域JavaScript的JSONP回调?
    跨域JavaScript的JSONP回调实现为了方便不同域之间的通信,引入了JSONP(JSON with Padding)。此技术涉及创建一个回调函数,该函数可用于包装 JSON 数据并使其可以从不同的域进行访问。下面是如何在 PHP 中实现 JSONP:接受回调参数首先,在 GET 请求中,我们...
    编程 发布于2024-11-08
  • 每周博客:本周我遇到的四件有趣的事情
    每周博客:本周我遇到的四件有趣的事情
    1. 避免 VS Code 中文件名混淆 在VS Code中编写C文件时,我将一个文件命名为first.c.cpp。完成程序后,我在执行过程中遇到了错误。经过30分钟的排查,我发现问题出在文件名: .c 扩展名导致 IDE 错误地将其识别为 C 程序,导致 VS Code 使用 g...
    编程 发布于2024-11-08
  • Python正则表达式中“\d”和“[0-9]”有什么区别?
    Python正则表达式中“\d”和“[0-9]”有什么区别?
    [字符]:正则表达式中的\dPython风格正则表达式中的“\d”字符类用于匹配数字。数字通常定义为数字字符 (0-9)。然而,值得注意的是,“\d”的行为可能会根据编程语言和实现的不同而有所不同。对于 Python,“\d”匹配满足 Unicode 的 \p{Nd} 的字符属性,其中包括以下内容:...
    编程 发布于2024-11-08
  • 如何在 Golang 中写入 Bytes.Buffer 的开头?
    如何在 Golang 中写入 Bytes.Buffer 的开头?
    Golang 中的前缀缓冲区写入在 Golang 中,bytes.Buffer 是一种为高效字符串连接和操作而设计的类型。然而,一些开发人员可能会遇到写入缓冲区开头的需要,这与仅附加到缓冲区的内置帮助器方法(例如 WriteString)不同。写入缓冲区开头虽然 bytes.Buffer 的底层 b...
    编程 发布于2024-11-08
  • 在 Laravel 中为本地文件创建临时 URL
    在 Laravel 中为本地文件创建临时 URL
    在 Laravel 中处理私有文件通常意味着涉及 S3 或 DigitalOcean 等第三方服务。但是如果您在本地开发环境中或者有一个轻量级项目怎么办?您可能不想依赖第三方云服务。 幸运的是,Laravel 可以轻松地为本地存储的文件提供临时 URL。这种方法可以加快开发速度并简化文件共享。 您只...
    编程 发布于2024-11-08
  • 了解如何创建 API 支持的 Zelda BOTW 怪物画廊 Web 组件
    了解如何创建 API 支持的 Zelda BOTW 怪物画廊 Web 组件
    模数教程回来了! 大家好!暑假结束后,我带着 Modulo 教程回来了。我正在制作更多教程 - 请继续关注。也就是说,如果您对我的下一个主题有任何具体想法,请务必在评论中告诉我! 我的上一篇教程是关于 API 驱动的 Pokémon Dance Party 组件的超级快速且有趣的“...
    编程 发布于2024-11-08
  • 如何将 jQuery 函数应用于具有相同 ID 的多个元素?
    如何将 jQuery 函数应用于具有相同 ID 的多个元素?
    使用 jQuery 访问具有相同 ID 的元素在 HTML 中,每个元素都应该有一个唯一的 ID。但是,在某些情况下,您可能需要将 jQuery 函数应用于具有相同 ID 的多个元素。在本文中,我们将探讨如何处理这种情况。根据提供的代码片段,jQuery 的 jcarousel() 函数仅应用于 I...
    编程 发布于2024-11-08
  • 查找包和 CLASSPATH
    查找包和 CLASSPATH
    按目录镜像包: Java 包映射到文件系统上的目录。 Java运行时查找包的三种方式: 当前工作目录:运行时系统使用工作目录作为起点。如果包在当前目录的子目录中,则会找到它。 CLASSPATH 变量:您可以配置 CLASSPATH 环境变量以包含包路径。 -classpath选项:在java和ja...
    编程 发布于2024-11-08
  • javaScript 中的方法重载
    javaScript 中的方法重载
    JavaScript 不直接支持方法重载(如 Java 或 C# 等语言),因为函数只能有一个定义。然而,JavaScript 是动态的,允许我们使用以下技术来模拟重载: 检查参数数量或类型。 使用默认参数。 使用参数或剩余参数。 下面是一些实现重载行为的方法。 1. 使用参数对象 ...
    编程 发布于2024-11-08
  • Linux环境下如何使用pthreads有效提升线程优先级?
    Linux环境下如何使用pthreads有效提升线程优先级?
    增强 pthread 中的线程优先级:综合指南在 Linux 环境中使用 pthread 时,通常需要将线程优先级调整为优化性能。本指南解决了线程优先级范围和描述的不确定性,以及与设置过高优先级相关的潜在风险。Linux 中的线程优先级Linux采用各种调度策略,每种策略都有自己的优先级系统。默认策...
    编程 发布于2024-11-08
  • 使用早期 AI 生成单元测试
    使用早期 AI 生成单元测试
    加速单元测试生成并提高代码质量 最近,我有机会深入研究 Early,一个专为自动单元测试生成而设计的 AI 代理。作为经常使用 TypeScript 和 ExpressoTS Framework 的人,我很想知道 Early 如何简化我的工作流程。我决定测试他们在我正在开发的名为 ...
    编程 发布于2024-11-08
  • 在Java中如何将字符数组转换为字符串?
    在Java中如何将字符数组转换为字符串?
    将 Char 数组转换为 String在 Java 中,可以使用 String 构造函数将 char 数组转换回字符串。以下代码说明了如何执行此转换:char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'}; String ...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3