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-phpConfigure 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
The sweet spot: use Laravel for your core API and business logic, Firebase for real-time features, notifications, and file storage.