tourze/tencent-meeting-bundle
A Symfony bundle that integrates the Tencent Meeting API into PHP applications, providing configuration, service wiring, and convenient clients for creating and managing meetings, participants, and related Tencent Meeting resources with minimal setup.
What this package is. tourze/tencent-meeting-bundle is a Symfony-style bundle (note the Bundle suffix and DependencyInjection/ conventions) that wires the Tencent Meeting REST API into a DI container. Despite the Laravel framing, treat it as a PSR-compatible PHP integration: the underlying API client can be used standalone, but the bundle's service definitions expect Symfony's container. Plan your first day around confirming which half you actually need.
Reality check on the release. 0.0.1 shipped with an empty changelog beyond the commit link, so there is no declared API surface. Do not assume stability. Before writing code:
composer require tourze/tencent-meeting-bundle in a scratch project (not your app).composer.json — note the required PHP version, the tourze/* peer packages it pins, and whether symfony/framework-bundle is a hard or dev dependency.src/DependencyInjection/Configuration.php (or config/services.php / a Resources/config/ directory). This file is the single source of truth for credential keys and extension points.src/Service/ and src/Entity/ to enumerate the actual domain objects (meetings, users, rooms, recordings).First use case: schedule a meeting. The lowest-friction path is a single "create meeting" call — it exercises auth signing, request serialization, and the response model in one shot:
$service = $container->get(\Tourze\TencentMeetingBundle\Service\MeetingService::class);
$meeting = $service->create([
'subject' => 'Daily sync',
'instanceid' => 1,
'start_time' => (string) now()->addHour()->timestamp,
'end_time' => (string) now()->addHours(2)->timestamp,
'userid' => config('tencent-meeting.host_userid'),
]);
If that returns a parsed object with a meeting_id, the wiring is sound and you can build outward. If it throws a container error, you have a Symfony/Laravel registration problem — solve that before touching API payloads.
Configuration. Tencent Meeting auth requires a secret_id / secret_key pair plus an app_id / operator userid context. Locate these keys in Configuration.php and mirror them into your app's config store. Never commit real keys; use your platform's secret manager.
Wrap the bundle service, don't call it directly. Bind the package service into your own thin gateway class implementing an interface you define. This insulates the rest of your codebase from 0.x churn and gives you one seam to swap for fakes in tests.
Cache signed tokens, not credentials. Tencent's signature is time-derived; the bundle may sign per request or expose a token provider. Check whether a token/access-token service exists. If it does, decorate it with your cache layer and reuse until expiry minus a safety margin — this is the single biggest latency win in a meeting-scheduling flow.
Queue the write operations. Create/update/cancel meeting calls are network-bound and rate-limited. Push them onto a queued job so your HTTP layer stays fast and you get automatic retry with backoff. Keep the read path (fetch meeting details) synchronous only when the UI genuinely blocks on it.
Model the identity mapping explicitly. Tencent Meeting identifies the organiser by userid inside the Tencent tenant, not by your application user. Maintain a table or cache mapping app_user_id -> tencent_userid. Skipping this is the most common source of "meeting created but owned by nobody" bugs.
Webhook/event ingestion as a first-class path. If the bundle exposes event or callback handling, register your endpoint early and log raw payloads verbatim before parsing. Meeting lifecycle events (started, ended, participant joined) are where most product value lives, and you want a clean record when the shape surprises you.
Idempotency on writes. Carry your own correlation ID through to the meeting's subject or an external-reference field if the API supports one. Retries in a queue plus a non-idempotent create endpoint equals duplicate meetings.
Test against a fake at the service boundary. Because the bundle resolves out of the container, the cleanest test strategy is to substitute your own gateway interface implementation. Reserve real-network tests for a single smoke test guarded by an env flag.
Laravel is not the target runtime. Package discovery, facade registration, and config/*.php publishing are Symfony idioms that Laravel will not honour. Confirm whether a laravel-tencent-meeting wrapper or a plain PSR client exists before committing to this bundle in a Laravel app. If you proceed, you will hand-register the container definitions yourself — budget for that.
Zero documented surface at 0.0.1. Pin the exact version in composer.json ("0.0.1", not ^0.0). With no changelog and no semantic-versioning commitment, an unpinned requirement is an outage waiting to happen. Read every diff between tags before upgrading.
Credential config keys are guesswork until verified. Do not copy key names from Tencent's raw REST docs into the bundle config — the bundle's Configuration.php normalises them, and a silently ignored key manifests as an auth failure with a misleading message. Verify each key against the source.
Signature and clock skew. Tencent's API rejects requests whose timestamp drifts from server time. If you see intermittent auth errors that resolve on retry, check NTP on your hosts before blaming the package.
Error handling is likely thin. Early-stage bundles often let the HTTP client's exception bubble straight through, or return a response object without checking the business-level error code (Tencent commonly returns HTTP 200 with a non-zero error envelope). Always inspect the parsed payload's status/error field explicitly rather than relying on exceptions.
Time fields are Unix timestamps as strings. Tencent's meeting start/end times are string-typed second-precision epochs, not ISO-8601 and not integers. Passing a Carbon instance or a formatted date string silently produces a wrong or rejected meeting. Cast deliberately and assert duration sanity.
Rate limits and pagination. List endpoints paginate; check whether the bundle's iterators handle next cursors or return a raw page you must loop yourself. Meeting-list calls are also rate-limited per app — batch and cache.
Extension points to look for. Priority order: a configurable HTTP client (so you can inject middleware for logging, retries, and metrics), an event dispatcher hook, and a serializable entity layer. If the bundle hardcodes its HTTP client, plan to fork or wrap at a higher level rather than patching vendor code.
Debugging loop. Log the outbound request ID and the raw JSON response together at debug level behind a feature flag. Because the package is undocumented, your own request/response log will become the reference documentation for your team — treat it as a deliverable, not a temporary aid.
How can I help you explore Laravel packages today?