kreait/laravel-firebase
Laravel package integrating the Firebase PHP Admin SDK. Configure via service account credentials, access Firebase services through Laravel-friendly bindings, and support multiple Firebase projects. Maintained under beste org; namespace/package name unchanged.
composer require kreait/laravel-firebase
php artisan vendor:publish --provider="Kreait\Laravel\Firebase\ServiceProvider" --tag=config
.env with your Firebase project details:
FIREBASE_DATABASE_URL=https://your-project.firebaseio.com
FIREBASE_CREDENTIALS=storage/app/firebase-auth.json # Path to your service account JSON
use Kreait\Laravel\Firebase\Facades\Firebase;
public function createUser()
{
$auth = Firebase::auth();
$user = $auth->createUser([
'email' => 'user@example.com',
'password' => 'securepassword123',
]);
return response()->json($user);
}
Use Laravel's DI container for type-hinted Firebase components:
use Kreait\Firebase\Auth;
use Kreait\Laravel\Firebase\Facades\Firebase;
class UserService {
public function __construct(private Auth $auth) {}
// Use $auth directly
}
Leverage the Firebase facade for quick access:
// Default project
$auth = Firebase::auth();
$firestore = Firebase::firestore();
// Specific project
$appAuth = Firebase::project('app')->auth();
Configure multiple projects in config/firebase.php:
'projects' => [
'app' => [
'database_url' => 'https://app-project.firebaseio.com',
'credentials' => storage_path('app/app-credentials.json'),
],
'admin' => [
'database_url' => 'https://admin-project.firebaseio.com',
'credentials' => env('FIREBASE_ADMIN_CREDENTIALS'),
],
],
$collection = Firebase::firestore()->collection('users');
$snapshot = $collection->where('role', '==', 'admin')->get();
$storage = Firebase::storage();
$bucket = $storage->bucket('my-bucket');
$bucket->upload('local-file.jpg', 'remote-file.jpg');
$messaging = Firebase::messaging();
$message = $messaging->createMessage([
'token' => 'device-token',
'notification' => ['title' => 'Hello', 'body' => 'World'],
]);
$messaging->send($message);
config/firebase.php:
'auth' => [
'cache_tokens' => true,
],
'http_client_options' => [
'middlewares' => [
\Kreait\Firebase\Middleware\LoggingMiddleware::class,
],
],
FIREBASE_AUTH_TENANT_ID for multi-tenant auth:
FIREBASE_AUTH_TENANT_ID=tenant123
Credentials Auto-Discovery:
GOOGLE_APPLICATION_CREDENTIALS, ensure the path is absolute or properly resolved.firebase-auth.json) are resolved via base_path()—test on Windows if using relative paths.Project Selection:
// ❌ Avoids default project
$auth = Firebase::project('app')->auth();
config/firebase.php.PHP Version:
composer.json constraints.Deprecated Facades:
FirebaseAuth, FirebaseDatabase, etc.) are removed. Use Firebase::auth() instead.Firestore Database Name:
(default) database name in config:
'firestore' => [
'default_database' => 'production',
],
Enable HTTP Debugging:
FIREBASE_HTTP_DEBUG_LOG_CHANNEL=stack
Logs requests/responses to Laravel’s log channels.
Token Caching Issues:
php artisan cache:clear
config/firebase.php to test live auth.Permission Errors:
project_id in credentials matches your Firebase project.Credentials Array:
credentials as an array, ensure all required fields are present (e.g., private_key must include -----BEGIN PRIVATE KEY----- and -----END PRIVATE KEY-----).Environment Variables:
FIREBASE_DATABASE_URL is required for Realtime Database. Firestore does not need this.HTTP Timeouts:
kreait/firebase v6.7.0). Adjust in http_client_options:
'http_client_options' => [
'timeout' => 60, // seconds
],
Custom Factories:
Firebase facade to add project-specific methods:
Firebase::extend('custom', function () {
return Firebase::project('app')->auth()->customMethod();
});
Middleware Injection:
'http_client_options' => [
'middlewares' => [
\App\Firebase\RetryMiddleware::class,
],
],
Event Listeners:
Firebase::auth()->onAuthStateChanged(function ($user) {
event(new UserLoggedIn($user));
});
Testing:
$this->mock(Firebase::class)->shouldReceive('auth')->andReturn($mockAuth);
FirebaseTestCase from the package for base test setup.batch() for multiple writes:
$batch = Firebase::firestore()->batch();
$batch->set($batch->document('users/1'), ['name' => 'John']);
$batch->commit();
limit() and cursor:
$snapshot = $collection->limit(100)->get();
'firestore' => [
'settings' => [
'cache_size_bytes' => Firebase\Firestore\CacheSize::CACHE_SIZE_UNLIMITED,
],
],
How can I help you explore Laravel packages today?