This package adds a push notification channel for notifications in Laravel 6 or greater projects.
For more on notification channels, visit https://laravel.com/docs/8.x/notifications
Install this package through Composer.
composer require origami/push
This package is designed to work with Laravel >= 6.
There are some API configuration options that you’ll want to overwrite. First, publish the default configuration.
php artisan vendor:publish --provider="Origami\Api\ApiServiceProvider"
This will add a new configuration file to: config/push.php
.
Version 4+ of this package uses edamov/pushok for the APNs transport and logic. You should add the following to your .env file to setup the required config, or see the edamov/pushok readme for Certificate (.pem) options.
The default private key location is storage/certificates/apns.p8
PUSH_APNS_ENV=production
PUSH_APNS_KEY_ID=
PUSH_APNS_TEAM_ID=
PUSH_APNS_APP_BUNDLE=
PUSH_APNS_PRIVATE_KEY=
PUSH_APNS_PRIVATE_KEY_SECRET=
Version 5 of this package uses the FCM HTTP v1 API and the origami/google-auth package to get oAuth tokens from service account credentials.
First set the project ID from your Firebase console:
PUSH_FCM_PROJECT="your-app-123abc"
Then generate and download your service account JSON file to generate oAuth access tokens.
- In the Firebase console, open Settings > Service Accounts.
- Click Generate New Private Key, then confirm by clicking Generate Key.
- Securely store the JSON file containing the key at:
storage/app/google-auth/service-account-credentials.json
If you want to change the loaded path you can set the GOOGLE_AUTH_SERVICE_CREDENTIALS
environment variable, or to change other settings you can publish the google-auth config: php artisan vendor:publish --provider="Origami\GoogleAuth\GoogleAuthServiceProvider"
You will most likely be storing devices in your database using an Eloquent model, e.g. App\Device
.
To have that work with this package, you just need to make sure it implements the Origami\Push\Contracts\Device
interface.
namespace App;
use Origami\Push\Contracts\Device as PushDevice;
class Device extends Model implements PushDevice {
}
Next, you need to add two methods to get the service - either apns
for iOS or fcm
for Firebase Cloud Messaging - and the device identifier.
public function getPushService()
{
switch ( $this->make ) {
case 'apple':
case 'ios':
case 'iphone':
return 'apns';
break;
case 'android':
return 'fcm';
break;
default:
throw new \Exception('Unable to determine push service for ' . $this->make);
}
}
public function getPushToken()
{
return $this->device_token;
}
In a Laravel project, you're most likely to send a push notification to your users. See the Laravel Docs for more information.
To get your User's devices, assuming you are using an Eloquent model above, you would just add a routeNotificationForPush
method to your Eloquent model.
public function routeNotificationForPush()
{
$devices = $this->devices()->get();
return $devices ? $devices->all() : [];
}
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Origami\Push\PushNotification;
class UserJoined extends Notification implements ShouldQueue
{
use Queueable;
public function __construct($user)
{
$this->user = $user;
}
public function via($notifiable)
{
return ['push'];
}
public function toPush($notifiable)
{
return (new PushNotification)
->setTitle('New User')
->setBody($this->user->name . ' just joined')
->setMeta([
'event' => 'NewUser',
'user' => $this->user->id
]);
}
}
<?php
$device = new Origami\Push\Device('apns', '12346...');
$push = (new Origami\Push\PushNotification)
->setBody('Testing, testing, 1, 2, 3.');
app('Origami\Push\PushManager')
->driver($device->getPushService())
->send($device, $push);
- v5.* - Version 5 is a breaking change that updates the config and drivers for fcm to use the new HTTP v1 API and service account credentials / oAuth.
- v4.* - Version 4 is a breaking change that updates the config and drivers for apns and fcm.
- v3.* - Version 3 bumps the Laravel support to include 6, 7 and 8 projects. Laravel 5.x dropped.
- v2.* - Version 2 is a rewrite of the package to work with Laravel 5.3 notifications or standalone
- v1.-* - Version 1 did not integrate with the notifications service of Laravel