FCM Notification Channel for Laravel
Send Firebase push notifications with Laravel php framework.
Installation
You can install this package via composer:
composer require ankurk91/fcm-notification-channel
Configuration
This package relies on laravel-firebase package to interact with Firebase services. Here is the minimal configuration you need in your .env
file
# relative or full path to the Service Account JSON file
FIREBASE_CREDENTIALS=firebase-credentials.json
You need to create a service account and place the JSON file in your project root.
Usage
You can use the FCM channel in the via()
method inside your Notification class:
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use NotificationChannels\FCM\FCMChannel;
use Kreait\Firebase\Messaging\CloudMessage;
class ExampleNotification extends Notification implements ShouldQueue
{
use Queueable;
public function via($notifiable): array
{
return [FCMChannel::class];
}
public function toFCM($notifiable): CloudMessage
{
return CloudMessage::new()
->withDefaultSounds()
->withNotification([
'title' => 'Hello',
'body' => 'Message body',
])
->withData([
'key' => 'string value'
]);
}
}
Prepare your Notifiable model:
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* Assuming that you have a database table which stores device tokens.
*/
public function deviceTokens(): HasMany
{
return $this->hasMany(DeviceToken::class);
}
public function routeNotificationForFCM(Notification $notification): string|array|null
{
return $this->deviceTokens->pluck('token')->toArray();
}
/**
* Optional method to determine which message target to use
* We will use TOKEN type when not specified
* @see \Kreait\Firebase\Messaging\MessageTarget::TYPES
*/
public function routeNotificationForFCMTargetType(Notification $notification): ?string
{
return \Kreait\Firebase\Messaging\MessageTarget::TOKEN;
}
/**
* Optional method to determine which Firebase project to use
* We will use default project when not specified
*/
public function routeNotificationForFCMProject(Notification $notification): ?string;
{
return config('firebase.default');
}
}
Send to a topic or condition
This package is not limited to sending notification to tokens.
You can use Laravel's on-demand notifications to send to a topic or condition or multiple tokens
use Illuminate\Support\Facades\Notification;
use Kreait\Firebase\Messaging\MessageTarget;
use App\Notification\ExampleNotification;
Notification::route('FCM', 'topicA')
->route('FCMTargetType', MessageTarget::TOPIC)
->notify(new ExampleNotification());
Notification::route('FCM', "'TopicA' in topics")
->route('FCMTargetType', MessageTarget::CONDITION)
->notify(new ExampleNotification());
Notification::route('FCM', ['token_1', 'token_2'])
->route('FCMTargetType', MessageTarget::TOKEN)
->notify(new ExampleNotification());
Events
You can consume Laravel's inbuilt notification events
namespace App\Providers;
use Illuminate\Notifications\Events;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
Events\NotificationSent::class => [
\App\Listeners\FCMNotificationSent::class,
],
Events\NotificationFailed::class => [
\App\Listeners\FCMNotificationFailed::class,
],
];
}
Here is the example of the failed event listener class
namespace App\Listeners;
use App\Models\User;
use NotificationChannels\FCM\FCMChannel;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Events\NotificationFailed;
class FCMNotificationFailed implements ShouldQueue
{
public function handle(NotificationFailed $event)
{
if ($event->channel !== FCMChannel::class) {
return;
}
/** @var User $user */
$user = $event->notifiable;
//todo Delete invalid device tokens from database
}
}
Read more about validating device tokens here
Additionally, you may want to ignore this exception in your app/Exceptions/Handler.php
protected $dontReport = [
\NotificationChannels\FCM\Exception\InvalidRecipientException::class,
];
Changelog
Please see CHANGELOG for more information what has changed recently.
Testing
composer test
Security
If you discover any security issue, please email pro.ankurk1[at]gmail[dot]com
instead of using the issue tracker.
Attribution
The package is based on this PR
License
This package is licensed under MIT License.