为了简化在各种事件(例如用户创建、密码重置等)后发送多封电子邮件通知,您可以采取一些步骤来集中通知和作业处理。这种方法将使您的工作更轻松且更具可扩展性,而无需为每个事件创建单独的作业或通知。
您可以创建一个将通知和用户作为参数的单个可重用作业,而不是为每个通知创建单独的作业。这样,同一个作业可以用来处理不同的通知。
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());
Laravel 的 事件监听器架构 无需在每个事件后手动调度作业,而是允许您根据特定事件(例如用户创建)自动触发通知和作业。
您可以定义一个事件,例如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; } }
您可以创建一个监听器,在事件触发时发送通知:
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()); } }
每当创建用户时,您都可以触发该事件,Laravel 将自动处理其余的事情:
use App\Events\UserCreated; $user = User::create($data); event(new UserCreated($user));
这种方法允许您将处理通知的逻辑与业务逻辑解耦,从而使系统更具可扩展性。
如果您有许多类似的通知(例如,欢迎电子邮件、密码重置等与用户相关的通知),您可以创建一个通知服务来集中处理所有用户通知。
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);
这种方法有助于保持代码干燥(不要重复自己),并且当您有多个电子邮件通知要发送时更容易维护。
以上是集中您的通知和作业处理的详细内容。更多信息请关注PHP中文网其他相关文章!