/Laravel-Google-PubSub-Broadcaster

Broadcast events to Google PubSub with Laravel.

Primary LanguagePHP

Laravel Google Pub/Sub Broadcaster

Easily broadcast events to Google Pub/Sub with Laravel.

Installation

$ composer require whatdafox/laravel-google-pubsub-broadcaster

Laravel will detect the service provider automatically.

Usage

Update your .env file:

BROADCAST_DRIVER=google-pubsub
GOOGLE_CLOUD_PROJECT=dev-moment-244207
GOOGLE_APPLICATION_CREDENTIALS=gcloud.json

Create an event and enable broadcasting:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;

class TestEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $someData;

    /**
     * Create a new event instance.
     *
     * @param $someData
     */
    public function __construct($someData)
    {
        $this->someData = $someData;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('your-channel-name');
    }
}

Subscribe

Package to subscribe to a topic will be coming soon. In the meantime, you can leverage the Google PubSub PHP library, for example:

<?php

namespace App\Console\Commands;

use Illuminate\Broadcasting\Channel;
use Illuminate\Console\Command;
use Google\Cloud\PubSub\PubSubClient;

class TestCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'pubsub:subscribe';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Subscribe to a Google PubSub channel';

    /**
     * Execute the console command.
     *
     * @param PubSubClient $client
     * @return mixed
     */
    public function handle(PubSubClient $client)
    {
        $topic = $client->topic('channel-name');
        
        if(!$topic->exists()) {
            $topic->create();
        }
        
        $subscription = $topic->subscription('subscriber-name');

        if(!$subscription->exists()) {
            $subscription->create();
        }

        while(true) {
            $messages = $subscription->pull([
                'returnImmediately' => true,
                'maxMessages' => 5,
            ]);

            if(empty($messages)) {
                continue;
            }

            foreach ($messages as $message) {
                
                // Do something with the message
                
                $subscription->acknowledge($message);
            }
        }
    }
}