localfr/uberall-bundle
A Symfony bundle for integrating the Uberall location marketing platform into PHP applications. It provides configuration and service wrappers for managing business listings, locations, and related Uberall API data. Use it to connect your app to Uberall APIs for local SEO and directory management.
Architecture fit — low, and the brief is mislabeled. The package is a Symfony bundle, not a Laravel package. It is a Bundle subclass with a DependencyInjection/*Extension.php and services.yaml, none of which Laravel's container discovers or compiles. There is no composer require → artisan command path, no config-cache integration, no facade, no service provider. The value on offer is a thin DI/config wrapper over Uberall's REST API — the useful part is the outbound client and the service definitions, not the Symfony plumbing. A TPM should treat the description's "Laravel/PHP package" framing as a defect to correct before it reaches a sprint plan, because it materially changes the effort estimate.
Integration feasibility — low as a dependency, moderate as a reference. Three routes, and the decision is a TPM decision because it sets the maintenance envelope:
UberallClient over Laravel's Http facade is smaller than the adapter work and gives first-class retries, pooling, and fakes. This is the default recommendation.UberallServiceProvider. Worth it only if the bundle encodes non-obvious payload mapping or directory-specific quirks.framework-bundle into the app, duplicates config/cache concerns, and creates a permanent upgrade tax with no product benefit.Technical risk — high, driven by signals not by code quality. One star, zero dependents, single maintainer, composite score 0.205, opportunity 14.89. The 2025-01-22 release shows a live maintainer, but that is the entire safety net: no CI matrix is visible, no security disclosure path, no downstream users to absorb the cost of discovering breakage. Bus factor is one. This is effectively sample code published under MIT.
Key questions for the spike (timeboxed, half a day):
symfony/framework-bundle, and at which major? That single constraint decides whether extraction is even possible on our Laravel version.ContainerAwareInterface?Stack fit — adapt the ideas, do not adopt the artifact. The Laravel-idiomatic target is one UberallClient (or a small set of typed clients per resource) bound as a singleton, configured from config/services.php under a uberall key, credentials in .env, all mutating calls behind queued jobs. That preserves config caching, Http::fake() testability, and Octane safety without inheriting Symfony kernel semantics.
Migration path and sizing. Sequence the work with explicit gates so the TPM can cut scope early:
| Step | Effort | Gate / exit criterion |
|---|---|---|
Spike: read services.yaml + Extension, enumerate endpoints and payloads |
0.5–1 day | Endpoint inventory and dependency-tree answer in hand |
| Build-vs-extract decision | 0.5 day | Written call, signed off by tech lead |
Adapter: UberallClientInterface + UberallClient + service provider + config |
1.5–2 days | Read endpoints working against sandbox |
| Queued jobs for writes, idempotency keys, dead-letter handling | 1.5–2 days | Bulk import survives a simulated 429 |
| Observability, feature flag, shadow-run parity check | 1–2 days | Dashboards + alert on auth failure |
Roughly one engineer-week for a production-ready adapter with jobs, tests, and observability — versus roughly two days if the bundle turns out to be a trivially thin wrapper and we write against Uberall's REST docs directly. The spike exists to decide between those two numbers before committing.
Compatibility — validate before anything else. Pin the constraint set: Laravel 11/12 ride Symfony 7.x components, Laravel 10 rides 6.1/7.x. If the bundle requires framework-bundle:^5.4 we are forced onto an EOL line or blocked outright. Also verify whether it assumes a parameter bag for config, which has no Laravel analogue.
Sequencing discipline. Read-only first (locations, listings, insights) → confirm data parity → then writes (location upsert, listing distribution) → then webhooks/insights ingestion. Never lead with writes: Uberall propagates changes to Google Business Profile, Apple Maps, Facebook, and Yelp, so a bad payload is externally visible and slow to unwind. Feature-flag the integration and shadow-run reads against the incumbent process before cutover.
Maintenance — adoption means ownership. With zero dependents there is no upgrade path we do not build. Budget for a fork under internals/uberall-client (path or VCS repo) so patching is a normal PR rather than a composer.json override. Treat the 0.205 score as an explicit instruction: this must not sit on a revenue-critical path as a load-bearing dependency.
Support — no SLA, no channel. Single maintainer, MIT, no commercial backing. Escalation during an incident is Uberall's own API support plus our logs. Acceptable for internal tooling; not acceptable for a customer-facing sync with an uptime target unless there is a named on-call owner and a runbook.
Scaling — bounded by Uberall's API, not by PHP. Validate per-account rate limits and burst behaviour, pagination page sizes, and batch vs. per-location write costs from Uberall's docs — the bundle will not tell us. Run everything on a dedicated uberall queue with a concurrency cap so a bulk location import cannot starve interactive jobs or trigger 429s. Cache read-heavy reference data (directory lists, location metadata) with a short TTL. The most likely performance cliff is an unbatched loop over hundreds of locations.
Failure modes to instrument from day one:
Ramp-up — moderate, with a cultural wrinkle. Laravel developers must read Symfony bundle conventions (Extension, Configuration, services.yaml) to interpret the reference implementation — a few hours, but a real friction point for teams without Symfony exposure. The larger learning curve is Uberall's domain model (accounts → business units → locations → listings → directories), which warrants an internal write-up regardless of integration path. Assign one owner for the adapter and one reviewer with Symfony literacy for the spike; that pairing keeps the knowledge from evaporating when the spike ends.
Recommendation. Do not take a runtime dependency on localfr/uberall-bundle. Fund a one-day spike to mine it as a reference for the Uberall API surface, then build a thin Laravel-native client with Http, queued jobs, and explicit failure handling — unless the spike shows non-trivial payload or directory-quirk logic worth vendoring as a small fork. Frame this to stakeholders as cost avoidance on glue code, not as an integration enabler: the build-vs-buy decision lives with the Uberall contract, and this package moves the needle by days, not sprints.
How can I help you explore Laravel packages today?