kreait/laravel-firebase
Laravel integration for the Firebase PHP Admin SDK. Configure via FIREBASE_ env vars using a service account JSON or array credentials, then access Firebase services in your app. Supports multiple Firebase projects and common Laravel workflows.
composer require kreait/laravel-firebase
php artisan vendor:publish --provider="Kreait\Laravel\Firebase\ServiceProvider" --tag=config
storage/app/firebase-auth.json or set the FIREBASE_CREDENTIALS environment variable.FIREBASE_DATABASE_URL in your .env file:
FIREBASE_DATABASE_URL=https://your-project-id.firebaseio.com
use Kreait\Laravel\Firebase\Facades\Firebase;
$user = Firebase::auth()->getUser('user-id');
Inject the Firebase facade or components directly into your services:
use Kreait\Laravel\Firebase\Facades\Firebase;
class UserService {
public function __construct(
protected Firebase $firebase
) {}
public function verifyToken(string $token): bool {
return $this->firebase->auth()->verifyIdToken($token);
}
}
Configure multiple projects in config/firebase.php:
'projects' => [
'default' => [
'database_url' => env('FIREBASE_DATABASE_URL'),
],
'app' => [
'database_url' => env('FIREBASE_APP_DATABASE_URL'),
],
],
Access a specific project:
$auth = Firebase::project('app')->auth();
$doc = Firebase::firestore()->document('users/user-id')->get();
$data = Firebase::database()->getReference('users/user-id')->getValue();
Firebase::messaging()->sendMulticast([
'tokens' => ['token1', 'token2'],
'notification' => ['title' => 'Hello', 'body' => 'World'],
]);
Add HTTP middleware (e.g., for logging or retries):
'http_client_options' => [
'middlewares' => [
\Kreait\Firebase\Middleware\Retry::class,
\Kreait\Firebase\Middleware\Logger::class,
],
],
Credentials Auto-Discovery:
GOOGLE_APPLICATION_CREDENTIALS or FIREBASE_CREDENTIALS. If using a custom path, ensure it’s resolvable (e.g., storage/app/firebase-auth.json).PHP Version:
Deprecated Facades:
FirebaseAuth, FirebaseDatabase, etc.) are removed. Use Firebase::auth(), Firebase::database(), etc.HTTP Timeouts:
kreait/firebase-php 6.7.0). Override in http_client_options:
'timeout' => 60, // in seconds
Firestore Default Database:
'firestore' => [
'default_database' => 'custom-db-name',
],
Enable HTTP Debug Logging:
'http_debug_log_channel' => 'single', // Logs to `storage/logs/firebase.log`
Or via .env:
FIREBASE_HTTP_DEBUG_LOG_CHANNEL=single
Token Caching:
php artisan cache:clear
Multi-Project Conflicts:
database_url and project_id are unique per project in config/firebase.php.Environment-Specific Configs:
Use .env for secrets and config/firebase.php for project-specific settings:
'projects' => [
'staging' => [
'database_url' => env('FIREBASE_STAGING_DATABASE_URL'),
],
],
Type Safety: Leverage PHP 8.3+ return types from the underlying SDK:
$user = Firebase::auth()->getUser('user-id'); // Returns `Kreait\Firebase\Auth\User`
Testing:
$this->mock(Firebase::class)->shouldReceive('auth')->andReturnSelf();
firebase-php's test utilities for SDK-specific assertions.Performance:
Firebase::auth()) instead of recreating them per request.AppCheck:
Firebase::appCheck()->verifyToken('app-check-token');
How can I help you explore Laravel packages today?