Installation
composer require joisarjignesh/bigbluebutton
Publish the config file:
php artisan vendor:publish --provider="Joisarjignesh\BigBlueButton\BigBlueButtonServiceProvider"
Configure .env with your BigBlueButton server URL and secret:
BBB_URL=https://your-bigbluebutton-server.com/bigbluebutton/api/
BBB_SECRET=your-secret-key
First Use Case: Create a Meeting
Inject the BigBlueButton facade or service into a controller:
use Joisarjignesh\BigBlueButton\Facades\BigBlueButton;
public function createMeeting()
{
$meeting = BigBlueButton::createMeeting([
'name' => 'Team Sync',
'meetingID' => 'team-sync-123',
'attendeePW' => 'password123',
'moderatorPW' => 'moderator123',
'record' => true,
]);
return response()->json($meeting);
}
Verify Connection
Use the checkConnection method to validate your credentials:
$response = BigBlueButton::checkConnection();
// Returns true if credentials are valid
Meeting Management
createMeeting() with required parameters (name, meetingID, passwords, etc.).
$meeting = BigBlueButton::createMeeting([
'name' => 'Weekly Standup',
'meetingID' => Str::uuid(),
'attendeePW' => 'guest-pass',
'moderatorPW' => 'host-pass',
'record' => true,
'voiceBridge' => '1234567890',
]);
$joinUrl = BigBlueButton::getJoinUrl($meeting['meetingID']);
return redirect()->away($joinUrl);
BigBlueButton::endMeeting($meeting['meetingID']);
Recording Handling
$recordings = BigBlueButton::getRecordings(['recordID' => '123']);
BigBlueButton::publishRecording($recordID, 'published');
BigBlueButton::deleteRecording($recordID);
Slides and Polls
$slideUrl = BigBlueButton::uploadSlide($meeting['meetingID'], 'path/to/slide.pdf');
$poll = BigBlueButton::createPoll($meeting['meetingID'], [
'title' => 'Feedback',
'question' => 'How was the session?',
'answers' => ['Good', 'Average', 'Poor'],
]);
Webhooks and Callbacks
.env:
BBB_END_MEETING_CALLBACK_URL=https://your-app.com/bbb/callback
Route::post('/bbb/callback', function (Request $request) {
$payload = $request->all();
// Validate and process payload (e.g., update DB)
});
Service Container Binding Bind the package to a custom interface for better testability:
$this->app->bind(
BigBlueButtonInterface::class,
function ($app) {
return new BigBlueButton($app->make('config'));
}
);
Queue Delayed Actions Offload recording processing to a queue job:
use Joisarjignesh\BigBlueButton\Jobs\ProcessRecording;
ProcessRecording::dispatch($recordID)->delay(now()->addMinutes(5));
Laravel Events Trigger events for meeting lifecycle hooks:
event(new MeetingCreated($meeting));
Listen for events in EventServiceProvider:
protected $listen = [
MeetingCreated::class => [
SendMeetingNotification::class,
],
];
API Rate Limiting Use Laravel’s rate limiting middleware for API calls:
Route::middleware(['throttle:10,1'])->group(function () {
Route::post('/bbb/webhook', 'WebhookController@handle');
});
Secret Key Validation
checkConnection() returns false even with correct credentials..env matches exactly (including trailing spaces/newlines) with the BigBlueButton server’s secret. Use:
$secret = trim(file_get_contents('/path/to/bbb-secret'));
Or fetch it dynamically from a secure source.MeetingID Collisions
meetingID errors when creating meetings.$meetingID = 'meeting-' . Str::uuid();
// OR
$meetingID = 'meeting-' . now()->format('YmdHis');
Recording Permissions
getRecordings() returns empty or 403 Forbidden.$response = BigBlueButton::getRecordings();
Log::debug($response->getContent());
Webhook Payload Validation
ValidateRequest to sanitize payloads:
public function handle(Request $request) {
$validated = $request->validate([
'event' => 'required|string',
'meetingID' => 'required|string',
'internalMeetingID' => 'nullable|string',
'secret' => 'required|string',
]);
}
Timeouts and Retries
config/bbb.php:
'guzzle_options' => [
'timeout' => 30,
'connect_timeout' => 10,
'retries' => 3,
],
Enable Debug Logging
Add to .env:
BBB_DEBUG=true
Logs will appear in storage/logs/laravel.log.
Raw API Responses Inspect raw responses for debugging:
$response = BigBlueButton::createMeeting([...]);
Log::debug([
'status' => $response->status(),
'body' => $response->getBody()->getContents(),
]);
BigBlueButton Server Logs
Check BigBlueButton’s logs/bbb-web-api.log for server-side errors.
Custom API Clients
Extend the BigBlueButton class to add methods:
namespace App\Services;
use Joisarjignesh\BigBlueButton\BigBlueButton as BaseBigBlueButton;
class CustomBigBlueButton extends BaseBigBlueButton {
public function customMethod($param) {
return $this->callApi('custom_endpoint', $param);
}
}
Middleware for API Calls Add middleware to log or modify requests/responses:
$this->app->extend('bbb.client', function ($client) {
$client->getEmitter()->addSubscriber(new BbBApiLogger());
return $client;
});
Database Models Create Eloquent models for meetings/recordings:
class Meeting extends Model {
protected $fillable = ['meeting_id', 'name', 'join_url', 'status'];
public static function createFromBbB($data) {
return self::create([
'meeting_id' => $data['meetingID'],
'name' => $data['name'],
'join_url' => $data['joinUrl'],
]);
}
}
Testing Use Laravel’s HTTP testing to mock API calls:
public function test_create_meeting() {
$this->mockBigBlueButtonApi()
->shouldReceive('createMeeting')
->once()
->andReturn(['meetingID' => 'test-123']);
How can I help you explore Laravel packages today?