bentools/webpush-bundle
Symfony bundle to send Web Push notifications using the Web Push protocol. Manage user-to-subscription associations (multi-device and shared devices) with your own persistence (Doctrine or custom). Includes VAPID key generation and backend APIs for subscriptions.
The UserSubscription Manager will handle creation and persistence of UserSubscription entities.
It can be connected to Doctrine, or you're free to use your own logic.
Then, create a class that implements BenTools\WebPushBundle\Model\Subscription\UserSubscriptionManagerInterface with your own logic.
Example with Doctrine:
# src/Services/UserSubscriptionManager.php
namespace App\Services;
use App\Entity\UserSubscription;
use BenTools\WebPushBundle\Model\Subscription\UserSubscriptionInterface;
use BenTools\WebPushBundle\Model\Subscription\UserSubscriptionManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\User\UserInterface;
class UserSubscriptionManager implements UserSubscriptionManagerInterface
{
/**
* [@var](https://github.com/var) ManagerRegistry
*/
private $doctrine;
/**
* UserSubscriptionManager constructor.
* [@param](https://github.com/param) ManagerRegistry $doctrine
*/
public function __construct(ManagerRegistry $doctrine)
{
$this->doctrine = $doctrine;
}
/**
* [@inheritDoc](https://github.com/inheritDoc)
*/
public function factory(UserInterface $user, string $subscriptionHash, array $subscription, array $options = []): UserSubscriptionInterface
{
// $options is an arbitrary array that can be provided through the front-end code.
// You can use it to store meta-data about the subscription: the user agent, the referring domain, ...
return new UserSubscription($user, $subscriptionHash, $subscription);
}
/**
* [@inheritDoc](https://github.com/inheritDoc)
*/
public function hash(string $endpoint, UserInterface $user): string {
return md5($endpoint); // Encode it as you like
}
/**
* [@inheritDoc](https://github.com/inheritDoc)
*/
public function getUserSubscription(UserInterface $user, string $subscriptionHash): ?UserSubscriptionInterface
{
return $this->doctrine->getManager()->getRepository(UserSubscription::class)->findOneBy([
'user' => $user,
'subscriptionHash' => $subscriptionHash,
]);
}
/**
* [@inheritDoc](https://github.com/inheritDoc)
*/
public function findByUser(UserInterface $user): iterable
{
return $this->doctrine->getManager()->getRepository(UserSubscription::class)->findBy([
'user' => $user,
]);
}
/**
* [@inheritDoc](https://github.com/inheritDoc)
*/
public function findByHash(string $subscriptionHash): iterable
{
return $this->doctrine->getManager()->getRepository(UserSubscription::class)->findBy([
'subscriptionHash' => $subscriptionHash,
]);
}
/**
* [@inheritDoc](https://github.com/inheritDoc)
*/
public function save(UserSubscriptionInterface $userSubscription): void
{
$this->doctrine->getManager()->persist($userSubscription);
$this->doctrine->getManager()->flush();
}
/**
* [@inheritDoc](https://github.com/inheritDoc)
*/
public function delete(UserSubscriptionInterface $userSubscription): void
{
$this->doctrine->getManager()->remove($userSubscription);
$this->doctrine->getManager()->flush();
}
}
Now, register your UserSubscriptionManager in your services.yaml:
# app/config/services.yml (SF3)
# config/services.yaml (SF4)
services:
App\Services\UserSubscriptionManager:
class: App\Services\UserSubscriptionManager
arguments:
- '[@doctrine](https://github.com/doctrine)'
tags:
- { name: bentools_webpush.subscription_manager, user_class: 'App\Entity\User' }
Previous: The UserSubscription Class
Next: Configuration
How can I help you explore Laravel packages today?