2.9 KiB
2.9 KiB
Realtime sync from Firebase -> Laravel (recommended)
Overview
If you store sensor data in Firebase Realtime Database (or Firestore), the recommended real-time approach is to deploy a Firebase Cloud Function that triggers on new data and POSTs the data to your Laravel API (POST /api/sensor). This offloads the realtime logic to Firebase and keeps your Laravel app as the canonical MySQL writer.
Secure the endpoint
- Set a shared secret in your Laravel
.envasFIREBASE_SYNC_SECRET=your-secret-here. - The Cloud Function will include that secret in the header
X-SYNC-SECRETwhen POSTing to/api/sensor.
Example: Realtime Database (Node.js Cloud Function)
- In your Firebase functions folder install node-fetch (or use built-in fetch on newer runtimes):
cd functions
npm install node-fetch@2
- Example
index.jsfunction:
const functions = require('firebase-functions');
const fetch = require('node-fetch');
exports.syncSensorToLaravel = functions.database
.ref('/sensors/{pushId}')
.onCreate(async (snapshot, context) => {
const data = snapshot.val();
try {
const res = await fetch('https://YOUR_LARAVEL_HOST/api/sensor', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-SYNC-SECRET': 'your-secret-here'
},
body: JSON.stringify({
suhu: data.suhu,
kelembapan: data.kelembapan,
soil: data.soil,
image_base64: data.image_base64 // if you store base64 in Firebase
})
});
const text = await res.text();
console.log('Sync result', res.status, text);
} catch (err) {
console.error('Sync failed', err);
}
});
Example: Firestore trigger (if you use Firestore)
exports.syncSensorToLaravel = functions.firestore
.document('sensors/{docId}')
.onCreate(async (snap, ctx) => {
const data = snap.data();
// same fetch call as above
});
Notes & tips
- If images are large, consider storing image URLs (Cloud Storage) instead of base64 in Firebase; then let Laravel download or reference them.
- Ensure your Laravel app is accessible from Cloud Functions (use HTTPS public URL, or a secured endpoint with token as shown).
- You can also verify requests further by signing payloads with HMAC, or restricting Cloud Function IPs (not recommended / unreliable).
Alternative approaches
- Polling: Laravel scheduled job that reads recent entries from Firebase (using Firebase Admin SDK for PHP). Simpler but higher-latency.
- Direct write from device: configure ESP32 to POST directly to Laravel (we already have
/api/sensor), bypassing Firebase entirely.
Next steps I can do for you
- Add
FIREBASE_SYNC_SECRETto your.envand commit a .env.example entry. - Update
SensorControllerto accept signed HMAC instead of plain secret. - Provide a ready-to-deploy Cloud Function file and deployment commands.
- Implement Firebase Admin-based polling in Laravel if you prefer no Cloud Functions.