dabsquared/dabsquared-push-notifications-bundle
## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require dabsquared/dabsquared-push-notifications-bundle
Enable the bundle in config/bundles.php:
Dabsquared\PushNotificationsBundle\DabsquaredPushNotificationsBundle::class => ['all' => true],
Configuration:
Update config/packages/dabsquared_push_notifications.yaml with your API keys (GCM, APNS, etc.) and database settings.
First Use Case:
Register a device via the admin interface (accessible at /admin/push_notifications/devices). Use the provided UI to:
user_id field).Sending a Notification:
Use the admin panel (/admin/push_notifications/messages) to create a new message:
Device Registration:
FCM or APNS) via JavaScript (e.g., Firebase SDK or PushNotification plugin)./api/push_notifications/devices with:
{
"token": "device_token_here",
"user_id": 123,
"platform": "ios" // or "android", "blackberry", "safari"
}
Sending Notifications:
use Dabsquared\PushNotificationsBundle\Manager\PushNotificationManager;
$manager = $this->get('dabsquared_push_notifications.manager');
$message = $manager->createMessage();
$message->setTitle('Hello!');
$message->setMessage('Check this out!');
$message->addDevice($deviceEntity); // or addUser($userEntity)
$manager->send($message);
$message->addUser($user); // Sends to all devices linked to the user
$message->addDevice($device); // Sends to a specific device
Payload Customization:
Message entity to include custom data:
$message->setData(['key' => 'value']); // Passed to the device as-is
$message->setAndroidData(['sound' => 'default', 'priority' => 'high']);
$message->setIosData(['badge' => 1, 'sound' => 'default']);
Event Listeners:
# config/services.yaml
Dabsquared\PushNotificationsBundle\EventListener\PushNotificationListener:
tags:
- { name: kernel.event_listener, event: dabsquared.push_notifications.send, method: onSend }
public function onSend(PushNotificationEvent $event) {
$message = $event->getMessage();
// Log, analyze, or modify the message before sending
}
Scheduled Notifications:
CronBundle or Laravel Tasks to queue delayed messages:
$message->setScheduledAt(new \DateTime('+1 hour'));
$manager->send($message);
Deprecated Dependencies:
// Old (GCM):
$message->setGcmApiKey('your_key');
// New (FCM):
$message->setFcmApiKey('your_fcm_key');
.pem certificates.Database Schema:
device table with columns: id, token, user_id, platform, created_at. Customize migrations if needed:
// Example migration for custom fields
Schema::table('device', function (Blueprint $table) {
$table->string('app_version')->nullable();
$table->boolean('is_active')->default(true);
});
Token Expiry:
/api/push_notifications/devices/{id}.PushNotificationEvent listener.Rate Limits:
PushNotificationManager:
try {
$manager->send($message);
} catch (RateLimitExceededException $e) {
sleep(2 ** $attempt); // Exponential backoff
$manager->send($message);
}
Admin Panel Quirks:
# config/packages/easy_admin.yaml
easy_admin:
entities:
Dabsquared\PushNotificationsBundle\Entity\Device:
class: Device
list: [id, token, platform, user]
form: [token, platform, user, is_active]
Logging:
config/packages/dabsquared_push_notifications.yaml:
debug: true
var/log/dev.log for failed sends.Payload Validation:
Common Errors:
Custom Providers:
Dabsquared\PushNotificationsBundle\Provider\AbstractProvider to support new platforms (e.g., Web Push):
class WebPushProvider extends AbstractProvider {
public function send($message, $device) {
// Implement Web Push logic
}
}
services.yaml:
Dabsquared\PushNotificationsBundle\Provider\WebPushProvider:
tags:
- { name: dabsquared.push_notifications.provider, platform: 'web' }
Message Transformers:
$manager->addTransformer('ios', function ($message, $device) {
$message->setData(array_merge($message->getData(), ['category' => 'news']));
});
Webhooks:
$event->getMessage()->getData()['webhook_url'] = 'https://your-service.com/webhook';
Analytics:
Device entity:
// Add to Device entity
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $lastDeliveryStatus;
// Update via listener
public function onSend(PushNotificationEvent $event) {
$device = $event->getDevice();
$device->setLastDeliveryStatus($event->getStatus());
$em->persist($device);
}
Batch Processing:
Messenger component to queue notifications:
$messageBus->dispatch(new SendPushNotification($message));
$manager->sendBatch($messages); // Hypothetical batch method
Caching:
$cache->set("user_{$userId}_devices", $devices, 3600);
How can I help you explore Laravel packages today?