enius/whereby-bundle
Symfony bundle for integrating the Whereby video meeting API into PHP applications, with services and configuration to create and manage video rooms and embed calls using Symfony's dependency injection.
First, confirm what you actually installed. Enius publishes Symfony bundles; this package is almost certainly a Symfony bundle (*Bundle.php, DependencyInjection/Configuration.php, Resources/config/services.yaml), not a Laravel package. There is no WherebyServiceProvider, no extra.laravel.providers, and php artisan vendor:publish will find nothing. Check composer.json (type, require, extra.symfony) before planning any integration work.
Minimal steps (assuming the Symfony bundle shape):
composer require enius/whereby-bundle — expect a platform conflict on PHP 8.x / Symfony 6+ since the last release was 2020-10-26. If it refuses, fork it, loosen require, and vendor it.DependencyInjection/Configuration.php — that is the authoritative list of config keys (almost certainly an API key/token, possibly a base URL). Ignore the README if it disagrees.src/ (look for Whereby, WherebyClient, WherebyService, or a Client/ directory). This is the only class you want to touch from your app.WHEREBY_API_KEY=.... If the bundle reads a container parameter, bridge it manually from config('services.whereby.key').new it in a Laravel service provider. If it does, you'll need to instantiate its dependencies by hand or write a thin adapter.First use case: create a meeting for a scheduled call and hand back two URLs — roomUrl for attendees, hostRoomUrl for the moderator. That single flow exercises auth, payload shape, and error handling, which is everything this package does.
Never call the bundle's client directly from controllers. Define your own contract and bind it:
interface VideoRoomProvider {
public function create(CarbonInterface $startsAt, CarbonInterface $endsAt, string $prefix): VideoRoom;
public function delete(string $meetingId): void;
}
Implement it with the Enius client, bind it in AppServiceProvider, and you've isolated a 2020 package with zero dependents behind one seam. When it breaks — and it will — you replace one class.
Persist everything the API returns. A video_rooms table with meeting_id, room_url, host_room_url (encrypted cast), starts_at, ends_at, provider. Room URLs are your only handle on the meeting later; the bundle gives you no local state.
Create rooms lazily, near the start time. Don't pre-provision a room per appointment weeks in advance. Whereby meetings have a fixed startDate/endDate window, and creating them on a queue job 15 minutes before the call keeps the room list clean and limits damage from a wrong payload.
Keep hostRoomUrl out of every serialized response. It's the equivalent of an admin link. Store it encrypted, expose it only through an authenticated endpoint scoped to the meeting owner. Attendees get roomUrl and nothing else.
Send dates in ISO 8601 UTC with a Z suffix. Whereby's API is UTC-only. If the bundle does any formatting, verify it doesn't strip the timezone — a naive Y-m-d\TH:i:s will silently create rooms in the wrong window.
Queue the API call and wrap it in a timeout + retry. Network calls to a third party do not belong in a request cycle that also writes to your DB. Use a job with retry(3), backoff, and a short connect timeout.
Test against your interface, not the package. Http::fake() only helps if the bundle uses Laravel's HTTP client — it won't; it predates it and will be on Guzzle or Symfony HttpClient. Fake VideoRoomProvider in feature tests and write one integration test against the real API behind a separate suite.
src/, copy the HTTP call, delete the dependency. That is often cheaper than fighting the version constraints.roomMode, templateType, hostRoomUrl, and changed response shapes. The bundle's DTOs may drop fields the API now returns, and may send fields the API now rejects. Log raw request/response bodies once during rollout and diff against current Whereby docs before trusting the client.DELETE /meetings/{id} deletes the meeting object, not necessarily an in-progress call. Don't build "end call" on top of it.%env()% inside a container parameter, php artisan config:cache won't help you — it's Symfony's container, not Laravel's. Resolve the key at the point of instantiation instead.meetingId. When a room silently fails to appear, the HTTP status is the only evidence you'll have.Http::withToken(). Both are legitimate; the second is more honest about what you're maintaining.How can I help you explore Laravel packages today?