fungio/google-calendar-bundle
Symfony bundle for integrating Google Calendar into your PHP app. Wraps the Google API client with ready-made services to authenticate, manage calendars, and create or sync events, simplifying scheduling features in Symfony projects.
Architecture fit — the headline finding is a platform mismatch. Despite being catalogued as a "Laravel/PHP package," fungio/google-calendar-bundle is a Symfony 3 bundle. It ships a *Bundle class, a DependencyInjection/ extension, and YAML service definitions — none of which Laravel consumes. Laravel reuses individual Symfony components (HttpFoundation, Console, etc.), not framework bundles. There is no service provider, no facade, no publishable config, and no Laravel-style container wiring. Adopting this into a Laravel app means porting, not installing.
What is likely salvageable is the thin domain layer: whatever service classes wrap Google's PHP client for calendar/event CRUD. That is typically 300–600 lines of code — reproducible in a day or two against google/apiclient directly, which materially undercuts the case for adopting this package at all.
Integration feasibility — low. Signal quality reinforces this: 10 stars, 0 dependents, an opportunity score of 1.45 and an overall score of 0.23. That is the profile of an abandoned side project, not a dependency. Symfony 3 itself has been end-of-life since November 2021 (standard support ended 2018), so the package's composer.json will almost certainly pin symfony/framework-bundle: ^3.0, which will hard-conflict with any modern Laravel (Laravel 10/11 pull Symfony 6/7 components). A composer require will likely fail outright before any code is written.
Technical risk — high, concentrated in three places:
| Risk | Why it matters |
|---|---|
| Symfony 3 EOL | Transitive constraints on old Symfony components; no security patching upstream. |
| Stale Google client | Almost certainly pins google/apiclient v1.x or early v2.x. Google has since shipped breaking changes to auth (OAuth2 token handling), incremental sync (syncToken), and push notification channel semantics. |
| PHP version floor | Likely PHP 5.6/7.0-era syntax in constraints. Modern Laravel requires 8.1+. |
| Zero community | 0 dependents means zero other teams have hit the edge cases you will hit. No issue history, no Stack Overflow corpus. |
Key questions for the engineering team before any commitment:
google/apiclient — is there real IP (recurrence handling, timezone normalization, multi-calendar fan-out) or just boilerplate?google/apiclient version and PHP constraint are pinned? Can we get a clean composer install in an isolated sandbox?spatie/laravel-google-calendar); the latter is a 50-line controller.Stack fit — do not integrate this package. The realistic options, ranked:
google/apiclient v2 + a first-party Laravel service provider. ~1–2 days of work, current auth and sync semantics, fully under our control, no transitive Symfony 3 constraints. This is the baseline that any adoption decision must beat.spatie/laravel-google-calendar or similar). Acceptable if the calendar surface is simple CRUD; check maintenance cadence and issue latency first.Migration path, if we pursue option 3: copy the service classes into app/Services/GoogleCalendar/; strip every Symfony\Component\DependencyInjection and Symfony\Component\Config reference; replace bundle configuration (config.yml parameters) with config/google-calendar.php + a CalendarServiceProvider binding; swap any Symfony HTTP client or event dispatcher usage for Laravel equivalents; rewrite tests off PHPUnit/Symfony KernelTestCase onto Laravel's test harness. Budget 3–5 engineer-days plus a day of test repair, versus under a day for option 1.
Compatibility: treat this as a hard gate, not a risk to manage. Run composer require fungio/google-calendar-bundle --dry-run in a throwaway branch of the actual target app before the spike is scheduled. If it conflicts — and it almost certainly will — option 3 collapses to "copy-paste the source files," which changes the effort estimate and the security review scope.
Sequencing:
syncToken, webhook channel registration and renewal, idempotency on retries.Maintenance — we become the maintainers on day one. With 0 dependents and 10 stars, there is no upstream to lean on and no realistic prospect of a PR being merged. Forking is not a contingency; it is the plan. Every hour spent porting is an hour spent on a codebase with no external reviewer and no CVE feed.
Support — effectively none. No issue tracker activity to consult, no community to escalate to. When Google changes its API surface (as it did with OAuth out-of-band flow deprecation and client library v2), we detect it in production or not at all. Contrast this with the maintained alternatives, which at minimum give us a canary.
Scaling — the constraint is Google's quotas, not our infrastructure. Default per-project allowance is roughly 1M queries/day with per-user-per-minute limits; a naive full-resync loop on a 10k-user base will hit 403 rateLimitExceeded quickly. Design requirements: exponential backoff with jitter, batched writes (events.batch), and incremental sync via syncToken rather than full listing. A stale Symfony 3 wrapper is unlikely to implement any of this out of the box — expect to build it regardless of which option we choose, which further erodes the package's value.
Failure modes to design against explicitly:
Ramp-up: the wrapper itself is a low-skill, low-risk port. The actual complexity is in OAuth consent management and calendar sync semantics — budget 1–2 sprint-equivalents for a production-grade integration no matter which path we take. That framing matters for the decision: the package saves us at most a couple of days against a 2-sprint budget, while adding a permanently unmaintained dependency.
Recommendation: do not adopt. The 0.23 score is directionally correct. Run Gate 0 to confirm what we suspect, then default to google/apiclient v2 with an in-house provider. The only scenario that reverses this is the spike uncovering substantial, correct, non-obvious calendar domain logic in the Fungio source — and even then, the right move is to copy that logic into our codebase, not to take the dependency.
How can I help you explore Laravel packages today?