When sending notifications through multiple channels (say email and SMS), you may want to throttle the number of notifications sent through a specific channel. For example, you could limit the number of SMS notifications sent to a user to 1 per day, and limit emails to 5 per day. This package allows you to configure this easily directly in your notification classes.
You can install the package via composer:
composer require syropian/laravel-notification-channel-throttling
- Ensure the notification you want to throttle implements
Syropian\LaravelNotificationChannelThrottling\Contracts\ThrottlesChannels
. - Implement the
throttleChannels
method. This method should return an array of channels to throttle, and the configuration for each channel. To omit a channel from throttling either omit the channel from the array, or set the value tofalse
.
use Illuminate\Notifications\Notification;
use Syropian\LaravelNotificationChannelThrottling\Contracts\ThrottlesChannels;
class ExampleNotification extends Notification implements ThrottlesChannels {
// ...
public function throttleChannels(object $notifiable, array $channels): array
{
/**
* Throttle the mail channel, so that only one
* email notification is sent every 15 minutes
*/
return [
'mail' => [
'maxAttempts' => 1,
'decaySeconds' => 900,
],
'database' => false,
];
}
}
By default, the rate limiter instance used to throttle is automatically scoped to the notification and channel. If you would like to further scope the rate limiter, you may pass a key
to the channel configuration.
public function __construct(public Post $post) {}
public function throttleChannels(object $notifiable, array $channels): array
{
return [
'mail' => [
'key' => $notifiable->id . ':' . $this->post->id,
'maxAttempts' => 1,
'decaySeconds' => 900,
],
'database' => false,
];
}
In this example we're rate limiting the mail channel, and we're scoping it to a specific combination of a user and a post.
composer test
The MIT License (MIT). Please see License File for more information.