Hindi
Back to Blog
FirebaseLaravelReal-Time

Firebase for Laravel: Real-Time Features Made Easy

RD

Raman Daksh

September 20, 2024 · 6 min read

Laravel excels at traditional request-response cycles, but some features need real-time capabilities. Firebase fills this gap perfectly. Here's how I integrate Firebase into Laravel projects.

Why Firebase + Laravel?

Laravel handles your business logic, database, and API. Firebase handles real-time updates, push notifications, and file storage. Together, they cover almost every backend need.

Setup

Install the Firebase PHP SDK:

composer require kreait/firebase-php

Configure with your service account:

// config/services.php
'firebase' => [
    'project_id' => env('FIREBASE_PROJECT_ID'),
    'service_account' => env('FIREBASE_SERVICE_ACCOUNT_PATH'),
],

Real-Time Notifications

Push notifications to Flutter apps via Firebase Cloud Messaging:

use KreaitFirebaseMessagingCloudMessage;
use KreaitFirebaseMessagingNotification;

class NotificationService
{
    public function sendToUser(User $user, string $title, string $body): void
    {
        $messaging = app('firebase.messaging');
        
        $message = CloudMessage::withTarget('token', $user->fcm_token)
            ->withNotification(Notification::create($title, $body))
            ->withData(['order_id' => $order->id]);
        
        $messaging->send($message);
    }
    
    public function sendToTopic(string $topic, string $title, string $body): void
    {
        $message = CloudMessage::withTarget('topic', $topic)
            ->withNotification(Notification::create($title, $body));
        
        app('firebase.messaging')->send($message);
    }
}

Real-Time Database Sync

For features like live chat or collaborative editing:

use KreaitFirebaseDatabase;

class ChatService
{
    public function sendMessage(string $roomId, array $data): void
    {
        $database = app('firebase.database');
        
        $database->getReference("rooms/{$roomId}/messages")
            ->push([
                'sender' => auth()->id(),
                'text' => $data['text'],
                'timestamp' => ServerValue::timestamp(),
            ]);
    }
    
    public function getMessages(string $roomId): array
    {
        $snapshot = app('firebase.database')
            ->getReference("rooms/{$roomId}/messages")
            ->orderByKey()
            ->limitToLast(50)
            ->getValue();
        
        return $snapshot ?? [];
    }
}

Firebase Storage

Handle file uploads without straining your Laravel server:

use KreaitFirebaseStorage;

class FileService
{
    public function upload(string $path, string $content): string
    {
        $storage = app('firebase.storage');
        $bucket = $storage->getBucket();
        
        $bucket->upload($content, [
            'name' => $path,
            'metadata' => ['cacheControl' => 'public, max-age=31536000'],
        ]);
        
        return $bucket->object($path)->publicUrl();
    }
}

Authentication Bridge

Sync Laravel auth with Firebase for seamless Flutter apps:

class FirebaseAuthController extends Controller
{
    public function verify(Request $request)
    {
        $verifiedIdToken = app('firebase.auth')
            ->verifyIdToken($request->id_token);
        
        $user = User::firstOrCreate(
            ['email' => $verifiedIdToken->claims()->get('email')],
            ['name' => $verifiedIdToken->claims()->get('name')]
        );
        
        return response()->json([
            'token' => $user->createToken('api')->plainTextToken,
        ]);
    }
}

When NOT to Use Firebase

  • When you need complex queries (use Laravel + MySQL)
  • When data relationships are important (Firebase is flat)
  • When you need ACID transactions across multiple collections
  • The sweet spot: use Laravel for your core API and business logic, Firebase for real-time features, notifications, and file storage.

    All Posts