Laravel FCM (Firebase Cloud Messaging) Notification Channel
Use this package to send push notifications via Laravel to Firebase Cloud Messaging. Laravel 5.5+ required.
This package works only with Legacy HTTP Server Protocol
This package can be installed through Composer.
composer require benwilkins/laravel-fcm-notification
If installing on < Laravel 5.5 then add the service provider:
// config/app.php
'providers' => [
...
Benwilkins\FCM\FcmNotificationServiceProvider::class,
...
];
Add your Firebase API Key in config/services.php
.
return [
...
...
/*
* Add the Firebase API key
*/
'fcm' => [
'key' => env('FCM_SECRET_KEY')
]
];
Use Artisan to create a notification:
php artisan make:notification SomeNotification
Return [fcm]
in the public function via($notifiable)
method of your notification:
public function via($notifiable)
{
return ['fcm'];
}
Add the method public function toFcm($notifiable)
to your notification, and return an instance of FcmMessage
:
use Benwilkins\FCM\FcmMessage;
...
public function toFcm($notifiable)
{
$message = new FcmMessage();
$message->content([
'title' => 'Foo',
'body' => 'Bar',
'sound' => '', // Optional
'icon' => '', // Optional
'click_action' => '' // Optional
])->data([
'param1' => 'baz' // Optional
])->priority(FcmMessage::PRIORITY_HIGH); // Optional - Default is 'normal'.
return $message;
}
When sending to specific device, make sure your notifiable entity has routeNotificationForFcm
method defined:
/**
* Route notifications for the FCM channel.
*
* @param \Illuminate\Notifications\Notification $notification
* @return string
*/
public function routeNotificationForFcm($notification)
{
return $this->device_token;
}
When sending to a topic, you may define so within the toFcm
method in the notification:
use Benwilkins\FCM\FcmMessage;
...
public function toFcm($notifiable)
{
$message = new FcmMessage();
$message->to('the-topic', $recipientIsTopic = true)
->content([...])
->data([...]);
return $message;
}
Or when sending with a condition:
use Benwilkins\FCM\FcmMessage;
...
public function toFcm($notifiable)
{
$message = new FcmMessage();
$message->contentAvailable(true)
->priority('high')
->condition("'user_".$notifiable->id."' in topics")
->data([...]);
return $message;
}
You may provide optional headers or override the request headers using setHeaders()
:
use Benwilkins\FCM\FcmMessage;
...
public function toFcm($notifiable)
{
$message = new FcmMessage();
$message->setHeaders([
'project_id' => "48542497347" // FCM sender_id
])->content([
'title' => 'Foo',
'body' => 'Bar',
'sound' => '', // Optional
'icon' => '', // Optional
'click_action' => '' // Optional
])->data([
'param1' => 'baz' // Optional
])->priority(FcmMessage::PRIORITY_HIGH); // Optional - Default is 'normal'.
return $message;
}
When a notification fails it will dispatch an Illuminate\Notifications\Events\NotificationFailed
event. You can listen
for this event and choose to handle these notifications as appropriate. For example, you may choose to delete expired
notification tokens from your database.
<?php
namespace App\Listeners;
use Benwilkins\FCM\FcmChannel;
use Benwilkins\FCM\NotificationFailedEvent;
class DeleteExpiredFCMTokens
{
public function handle(NotificationFailedEvent $event): void
{
if ($event->channel == FcmChannel::class) {
if ($event->data['results'][0]['error'] == 'InvalidRegistration') {
$event->notifiable->update(['device_token' => null]);
}
}
}
}
Remember to register your event listeners in the event service provider.
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Benwilkins\FCM\NotificationFailedEvent::class => [
\App\Listeners\DeleteExpiredFCMTokens::class,
],
];
To process any laravel notification channel response check Laravel Notification Events
This channel return a json array response:
{
"multicast_id": "number",
"success": "number",
"failure": "number",
"canonical_ids": "number",
"results": "array"
}
Check FCM Legacy HTTP Server Protocol for response interpreting documentation.
The MIT License (MIT). Please see License File for more information.