gulaandrij/google-sheets-bundle
A Symfony bundle for integrating the Google Sheets API into your application. Configure credentials and use simple services to read, write, and sync spreadsheet data, making Google Sheets a convenient lightweight data source or backend for your project.
SheetsServiceInterface, so the "we can swap it later" promise is now a one-line type hint rather than a refactor we owe ourselves.SheetsWriteEvent (PSR-14, dispatched after append/update/clear/addSheet/deleteSheet) also gives us a supported hook for cache invalidation and audit logging without forking or wrapping the write path — that removes one of the main recurring engineering arguments against the shortcut.append(), matching production) means we can build and demo the flow in CI without live credentials.Adopt only when all of these hold:
revolution/laravel-google-sheets — a Laravel package — which means non-trivial transitive baggage in a Symfony app and no benefit at all in a Laravel app, where you would use the underlying package (or google/apiclient directly) instead.SheetsWriteEvent gives you an after-the-fact notification; it is not a transaction boundary, so it does not change this criterion.SheetsWriteEvent fires from a single application instance — with multiple app servers or out-of-band spreadsheet edits, it is not a distributed invalidation mechanism. Budget a TTL or a shared cache store.SheetsServiceInterface, not the concrete SheetsService. The interface now covers read/write/discovery/metadata and is what SheetsRegistry::service() returns. Be aware the escape hatches (client(), driveService()) intentionally remain on the concrete class — if your code needs those, the swap-out story weakens.Look elsewhere when:
revolution/laravel-google-sheets directly, or google/apiclient if you want full control. Adding a Symfony wrapper to a Laravel app is inverted and unjustifiable.break, missing findSheetNameById traces, and truncated call-site capture); good enough for dev, don't sell it as production observability.To executives (one paragraph): This is a small, MIT-licensed integration that lets our Symfony application read and write Google Sheets directly, so business teams can edit content and reference data in a tool they already use instead of waiting on engineering for an admin panel. It's a speed-and-cost play for low-risk internal data: it compresses weeks of internal tooling into days and lets us validate features before committing to a real CMS or database. The latest release adds the two things we'd otherwise have had to build ourselves — a stable interface to code against, so migrating off is contained, and write notifications, so cache and audit behaviour is handled without custom plumbing. The trade-off is unchanged and deliberate: it's maintained by a single developer with essentially no external adoption, so it's appropriate for internal, non-critical, low-traffic data only, and we should budget a migration path rather than treat it as permanent infrastructure.
To engineering (one paragraph): gulaandrij/google-sheets-bundle v1.3.0 is a Symfony bundle that wraps revolution/laravel-google-sheets. The layering caveat still stands: on Laravel, use the underlying package and skip this. On Symfony, v1.3.0 materially improves the integration story — SheetsServiceInterface is implemented by all four service variants and autowired as SheetsServiceInterface $<name> alongside the existing concrete aliases, and SheetsRegistry::service() now returns the interface, so inject the interface and keep the concrete type out of feature code. SheetsWriteEvent (PSR-14) fires after successful writes with operation, spreadsheetId, sheetName, range, rowCount — use #[AsEventListener] for cache invalidation and audit logging; reads deliberately don't dispatch, and the event dispatcher is optional (nullOnInvalid()) so apps without symfony/event-dispatcher still boot. The in-memory fake now enforces the same homogeneous-row shape check as production (MixedRowShapeException), so tests no longer drift from real behaviour. Caveats: client() and driveService() remain on the concrete class only, so anything needing raw SDK access is not covered by the abstraction; the event is per-instance, not a cross-node invalidation bus; and adoption signals are still thin (0 stars, 0 dependents, single maintainer). Recommendation: acceptable for internal tooling and prototypes, type-hint the interface, add caching in front of reads, and keep a documented swap-out plan.
How can I help you explore Laravel packages today?