https://github.com/mrgarest/laravel-firebase-sender
Laravel library for sending notifications with Firebase Cloud Messaging (FCM)
https://github.com/mrgarest/laravel-firebase-sender
fcm fcm-notifications firebase laravel laravel-package php
Last synced: 6 months ago
JSON representation
Laravel library for sending notifications with Firebase Cloud Messaging (FCM)
- Host: GitHub
- URL: https://github.com/mrgarest/laravel-firebase-sender
- Owner: mrgarest
- License: mit
- Created: 2024-09-26T11:11:26.000Z (almost 2 years ago)
- Default Branch: master
- Last Pushed: 2025-07-26T18:57:46.000Z (12 months ago)
- Last Synced: 2025-08-30T11:46:44.882Z (10 months ago)
- Topics: fcm, fcm-notifications, firebase, laravel, laravel-package, php
- Language: PHP
- Homepage:
- Size: 49.8 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Laravel Firebase Sender
Laravel library for sending notifications with Firebase Cloud Messaging (FCM).
_If you have previously used the old version of v2, you should read the instructions for [migrating to v3](https://github.com/mrgarest/laravel-firebase-sender/blob/master/migrating-to-v3.md)._
### Supported platforms
| ✅ | Platform |
| --- | -------- |
| ✅ | Apns |
| ✅ | Android |
| ✅ | WebPush |
## Installation
You can install the package via composer:
```
composer require mrgarest/laravel-firebase-sender
```
## Configuration
After installing the package, you will need to publish the configuration file `firebase-sender.php`
```
php artisan vendor:publish --tag=firebase-sender-config
```
After publishing the configuration file, you need to open it and add the Service account data from the Firebase console.
_If you don't know how to get a Service account, here is a [video from YouTube](https://www.youtube.com/watch?v=aeBiLIw2KnY)._
## Usage
`FirebaseSender` is a class that is responsible for sending notification to devices via Firebase Cloud Messaging (FCM) using a service account with Firebase.
```php
$firebaseSender = new FirebaseSender('MY_SERVICE_ACCOUNT_NAME');
```
`MY_SERVICE_ACCOUNT_NAME` - the identifier of your service account registered in the `firebase-sender.php` configuration.
### Send a notification to a specific device
To send a notification directly to the device, use the `setDeviceToken` method, passing in a unique device token generated by Firebase.
```php
$firebaseSender->setDeviceToken('DEVICE_TOKEN');
```
_Note that you can use either `setDeviceToken` or `setTopic`. You cannot use both methods._
### Send a notification on a specific topic
To send a notification to all devices subscribed to a specific topic, use the setTopic() method, passing the topic name as a string:
```php
$firebaseSender->setTopic('TOPIC_NAME');
```
#### Topic conditions
The TopicCondition class allows you to create complex logical conditions for determining the topics to which a notification will be sent.
To send a notification to a combination of topics, you need to build a boolean expression that describes the target topics. The expression can contain the AND (`&&`) and OR (`||`) operators, as well as grouping using parentheses.
For example, to send a notification to devices subscribed to `topicA` and (`topicB` or `topicC`), you can build the following expression:
```php
$firebaseSender->setTopic(TopicCondition::make()
->topic('topicA')
->and()
->group(fn($group) => $group->topic('topicB')->or()->topic('topicC'))
);
```
### Set notifications
The `setNotification` method allows you to set the main content of the notification that will be sent through Firebase.
```php
$firebaseSender->setNotification(new NotificationPush(
title: 'TITLE',
body: 'BODY'
));
```
### Set notifications for Android
The `setAndroid` method allows you to set the notification content for Android devices.
```php
$firebaseSender->setAndroid(new AndroidPush(
title: 'TITLE',
body: 'BODY'
));
```
### Set notifications for APNs
The `setApns` method allows you to set the notification content for APNs (Apple Push Notification Service).
```php
$firebaseSender->setApns(new ApnsPush(
title: 'TITLE',
body: 'BODY'
));
```
### Send a notification
After configuring the notification, you can send it by calling the `send` method.
```php
$firebaseSender->send(): SendReport
```
If you don't want to send the message immediately, but want to schedule it for later, you can use the `sendJob` method. To use this method, [queues](https://laravel.com/docs/12.x/queues) must be configured in your Laravel project.
```php
$firebaseSender->sendJob(Carbon $scheduledAt, int $chunkLength = 10, int $maxRand = 0): void
```
This method takes one required value and two optional values.
| Value | Type | Required | Description |
| -------------- | -------- | -------- | -------------------------------------------------------------- |
| `$scheduledAt` | `Carbon` | Yes | Date when notification should be sent |
| `$chunkLength` | `int` | No | Allows you to split messages into chunks |
| `$maxRand` | `int` | No | Adds a random number of seconds to the chunk dispatch schedule |
### Clear
When you need to send new notifications, you can simply clear the previously sent data without having to re-announce the class.
```php
$firebaseSender->clear(): void
```
### Grouping
Using the `setGroup` grouping method, you can send multiple messages at once by combining messages into groups.
```php
$firebaseSender->setGroup(int $index): void
```
Each group must have its own index, recipient, and message body.
Example of sending group notifications:
```php
$firebaseSender = new FirebaseSender('MY_SERVICE_ACCOUNT_NAME');
$firebaseSender->setGroup(0);
$firebaseSender->setDeviceToken("MY_DEVICE_TOKEN_1");
$firebaseSender->setNotification(new NotificationPush(
title: "Lorem ipsum",
body: 'Lorem ipsum dolor sit amet consectetur adipisicing elit.',
));
$firebaseSender->setGroup(1);
$firebaseSender->setDeviceToken("MY_DEVICE_TOKEN_2");
$firebaseSender->setNotification(new NotificationPush(
title: "Lorem ipsum",
body: 'Lorem ipsum dolor sit amet consectetur adipisicing elit.',
));
$firebaseSender->send();
```
### Custom messages
With this method, you can specify a custom data structure for the messages to be sent through FCM. This can be useful for sending additional information that is not included in the standard notification options.
```php
$firebaseSender->setMessages([
[
'token' => 'DEVICE_TOKEN',
'notification' => [
'title' => 'TITLE',
'body' => 'BODY'
]
]
]);
```
_When using `setMessages`, the `setNotification`, `setAndroid` and `setApns` methods will not work._
## Localized notifications
`AndroidPush` and `ApnsPush` support sending localized notifications, which allows you to dynamically display text depending on the user's language.
To do this, use the `titleLocKey` and `bodyLocKey` parameters, which specify the keys to localized strings in your application's resources.
You can also specify the `titleLocArgs` and `bodyLocArgs` parameters, which can be used to pass values that will be inserted into localized notification templates.
## Notification log
If you want to use the log of sent notifications, you will also need to publish the migration file and perform the migration.
```
php artisan vendor:publish --tag=firebase-sender-migrations
```
```
php artisan make:migration
```
To store information about sent notifications in the database, you can enable the event log.
```php
$firebaseSender->logEnabled(bool $enabled = true): void
```
The event log also supports two additional methods for adding payloads to the log.
```php
$firebaseSender->setPayload1(?string $payload = null): void
$firebaseSender->setPayload2(?string $payload = null): void
```
### FirebaseSenderLog Query Scopes
#### messageId
Filter logs by the message ID.
```php
$query->messageId(45543643);
```
#### serviceAccount
Filter logs by the service account used to send the notification.
```php
$query->serviceAccount('MY_SERVICE_ACCOUNT_NAME');
```
#### deviceToken
Filter logs by the device token (for notifications sent to a specific device).
```php
$query->deviceToken('DEVICE_TOKEN');
```
#### Topic
Filters records where the topic exactly matches the value passed.
```php
$query->topic('TOPIC_NAME');
```
If you need to search for a topic that may appear as part of a condition, use the `matchTopic` method. It allows matching both exact topics and topics used in conditions.
```php
$query->matchTopic('TOPIC_NAME');
```
By default, `matchTopic` checks for both exact and conditional matches. If you want to search only within conditions, pass true as the second argument:
```php
$query->matchTopic(
'TOPIC_NAME',
true
);
```
#### Payload
`payload1` and `payload2` filter logs by the first value of the user payload.
```php
$query->payload1('language');
```
#### createdBetween
Filter logs created between two dates.
```php
$query->createdBetween(
Carbon::now(),
Carbon::now()->subHours(1)
);
```
#### sentBetween
Filter logs where the notification was sent between two dates.
```php
$query->sentBetween(
Carbon::now(),
Carbon::now()->subHours(1)
);
```
#### scheduledBetween
Filter logs where the notification was scheduled between two dates.
```php
$query->scheduledBetween(
Carbon::now(),
Carbon::now()->subHours(1)
);
```
#### failedBetween
Filter logs where the notification failed between two dates.
```php
$query->failedBetween(
Carbon::now(),
Carbon::now()->subHours(1)
);
```