Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Foursquare Api Bundle Laravel Package

jcroll/foursquare-api-bundle

Symfony bundle that integrates the Foursquare API, providing ready-made services and configuration so you can query venues, check-ins, users, tips, and other endpoints directly from your Symfony application.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

v1.1.4 does not change the verdict: this is still a Symfony bundle, not a Laravel package. The release touches the bundle's DI extension and config tree — it teaches the container how to wire jcroll/foursquare-api-client ~2.1 and drops two container parameters — which is work that only has meaning inside a Symfony kernel. There is still no ServiceProvider, no publishable config/*.php, no facade, no Illuminate dependency anywhere in the diff. Laravel installs the code and never boots it.

The only reusable asset remains the transitive jcroll/foursquare-api-client, a thin HTTP wrapper around Foursquare's legacy v2 REST endpoints. The integration decision is unchanged: (a) depend on the client directly, (b) fork the small client into app/Services, or (c) call the Places API through Laravel's Http facade. Option (c) remains the recommended default.

What v1.1.4 does add is a sharper compatibility signal. Pinning ~2.1 tells us the bundle now tracks a specific legacy branch of the client rather than floating; that is marginally good for reproducibility inside Symfony and entirely irrelevant to us, because we would be consuming the client, not the bundle, and would pin our own constraint regardless.

Integration feasibility

Low-to-moderate, unchanged, and still entirely a function of the underlying client rather than the bundle.

  1. Composer resolution. The bundle still drags Symfony 2.x/3.x components and, transitively, an old Guzzle (3.x/5.x). Modern Laravel (10/11) requires PHP 8.1+ and Guzzle 7. The v1.1.4 constraint change re-points a dependency edge; it does not modernise the graph. Expect the same constraint conflicts and the same risky escapes (--ignore-platform-reqs, aliases, replace stanzas).
  2. API surface drift. Unchanged and unaddressed by this release. Foursquare's legacy v2 API has been superseded by the Places API with different auth, paths, and response envelopes. A ~2.1 client branch encodes assumptions that are largely no longer true; a config-component tweak does not touch that.
  3. Framework glue. Anything the bundle provides (config tree, service wiring) must still be re-authored for Laravel — and v1.1.4 just changed the shape of that config tree, so any notes or forks taken against the prior release are now slightly stale. Small work, but we own it.

Technical risk

  • Abandonment (high, unchanged). The release is a maintenance blip on a package last meaningfully updated in 2016 — 6 stars, 0 dependents, health score 0.09, no security response path. A one-line config fix is not a revival. Still treat as source to vendor, not a dependency to trust.
  • Version governance (new, medium). The changelog states it removed jcroll_foursquare_api.client_id and client_secret container parameters — a genuine BC break for any Symfony consumer reading them — while explicitly declining a major bump: "possible b/c but I don't consider major enough to bump versions." That is a maintainer declaring breaking changes non-major. Anyone on ^1.0 can receive a BC break on a minor or patch. It reinforces the existing rule: pin a commit hash, never track a branch or a caret range.
  • Supply chain (medium-high, unchanged). Pinned legacy Guzzle and Symfony releases carry known CVEs with no upgrade path short of a rewrite. v1.1.4 does not move Guzzle.
  • Correctness (high, unchanged). Still unverified whether any targeted endpoint responds as the client expects. No fixtures, no tests added in this release. Spike remains mandatory.
  • Vendor lock (low, unchanged). The client is small and thin — the one favourable dimension.

Key questions

  • Does the team actually need Foursquare, or is this a "nearby places" requirement Google Places / Mapbox / OSM can satisfy with a maintained SDK?
  • Which Foursquare API tier and auth model are we contracting for — legacy v2 keys or Places API service keys? v1.1.4 changes nothing here, so the ambiguity persists.
  • Is the call path read-only and non-critical (enrichment) or user-blocking?
  • Do we have appetite to own a fork, or is a ~150-line HTTP adapter against the current API strictly cheaper?
  • What are the quota, rate-limit, and attribution obligations for the chosen tier?
  • (New) If any Symfony service in our estate does adopt this bundle, who tracks the ^1.0 range given the maintainer's stated position on semver? If the answer is "nobody," the range should be pinned now.

Integration Approach

Stack fit

Unchanged. Target state for Laravel 10/11, PHP 8.1+, Composer 2: a FoursquareClient interface in app/Contracts, one implementation on Laravel's HTTP client, credentials in config/services.php from .env, bound as a singleton in a small FoursquareServiceProvider. v1.1.4 does not alter this recommendation — it is the same configured, injectable client without the dependency graph.

Migration path

  1. Spike (1–2 days). Obtain current credentials and hand-execute the two or three endpoints the product needs (search/venues, venues/{id}, maybe photos) with curl. Go/no-go gate. Unchanged — note the release adds no evidence either way.
  2. Prefer replacement over adoption. Write the adapter against the live API. Do not attempt to install the bundle in a Laravel app; v1.1.4's config-component work is invisible to us and the constraint resolution still costs more than the adapter.
  3. Fork only if logic is non-trivial. If the client holds meaningful logic (normalisation, pagination, orchestration) worth preserving, fork into app/Services/Foursquare or a private VCS repo, strip the Symfony wrapper and DI extension, port to Guzzle 7 / Http, and pin a commit hash. The v1.1.4 semver behaviour makes this non-negotiable. When forking, target the ~2.1 branch the bundle now references rather than whatever was current before, so you fork the newest available legacy code — then expect to rewrite the endpoints anyway.
  4. Contain. All Foursquare access behind the interface; no Foursquare types or raw payloads in domain code. Caps the cost of the next migration when the API shifts again.

Compatibility

Explicitly test for PHP 8.x deprecations and removals (each(), curly-brace string offsets, dynamic properties, create_function) in any forked code, and confirm TLS/CA handling in the container. The ~2.1 client pin does not evidence PHP 8 work — do not read the release as compatibility progress. If a fork must coexist with Laravel's Guzzle 7, replace the old Guzzle usage rather than installing both; Guzzle 5 and 7 cannot share a lockfile.

Sequencing

Unchanged: discovery spike → build-vs-buy → interface definition → adapter behind a feature flag → shadow traffic or synthetic checks → flip flag → decommission any fork. Roughly one sprint for a read-only integration with caching; add a sprint for writes, user auth, or batch enrichment. If a Symfony consumer in the estate is affected by the removed container parameters, that is a separate, small, parallel piece of work — migrate it to read from the config tree or environment and pin the constraint while you are in there.

Operational Impact

Maintenance

Ownership remains the dominant cost. A vendored fork means every PHP minor, Guzzle CVE, and Foursquare contract change lands on us with no upstream. Keep the surface deliberately minimal (three endpoints, bounded retry policy, no custom auth flows) and keep the repo note on provenance, pinned commit, and replacement triggers. Add one line to that note: the upstream does not practise semver, so no caret ranges, ever.

Support

No maintainer responsiveness, no release cadence, no escalation path beyond internal. v1.1.4 is a single-commit gesture, not a support relationship — do not let it reset expectations or get cited as evidence the package is "actively maintained." Ensure at least two engineers can read and modify the integration; document the Foursquare account, key rotation, and quota owner in the runbook.

Scaling

Unchanged and application-side non-issue: the client is I/O-bound and stateless. Real ceilings are external — Foursquare quotas, rate limits, per-call latency, cost at volume. Mitigate with a cache keyed on venue/geohash (TTL in hours; venue metadata is slow-moving), request coalescing for hot geographies, and a bounded concurrency pool so a spike cannot burn the quota in minutes.

Failure modes

  • Auth failure (401/403) from legacy keys against a migrated API — total feature outage, not degradation.
  • Endpoint removal (404/410) after a version sunset — silent until first production call absent synthetic monitoring.
  • Quota exhaustion (429) under load; needs backoff with jitter, a circuit breaker, and a defined degraded path (empty nearby-results, not a 500).
  • Dependency rot — legacy Guzzle failing TLS verification, or a PHP upgrade breaking a fork during an unrelated platform upgrade. Sneakiest mode: surfaces during a Laravel upgrade, not a Foursquare change.
  • Silent data drift — schema changes that don't error but yield nulls; guard with contract tests on recorded fixtures.
  • Config-contract drift (new, narrow) — for any Symfony consumer, v1.1.4 silently removed two container parameters. Code reading %jcroll_foursquare_api.client_id% fails at container compile or runtime. Grep for those parameter names across the estate; this one costs minutes to check.

Instrument request count, latency, error rate by status class, and cache hit ratio. Alert on 401/410 specifically — contract-level breakage, not transient failure.

Ramp-up

Code volume is small, so comprehension cost is low; a mid-level engineer reads the whole thing in an afternoon. The cost is contextual: which Foursquare API generation we are on, where keys live, what the quota is, why the code is forked rather than installed, and why the vendored copy is pinned to a commit. Write that down at integration time — it is the difference between a two-hour and a two-day onboarding, and it is the only durable defence against a package whose upstream just demonstrated it will ship BC breaks on a patch version.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels