routmoute/routmoute-sirene-bundle
A PHP bundle for working with French SIRENE business registry data. Look up companies by SIREN or SIRET, map INSEE records to usable objects, and integrate official enterprise information into your Symfony or PHP application.
Architecture fit. routmoute-sirene-bundle is a thin client for the French INSEE SIRENE API (SIREN/SIRET legal-entity and establishment lookups). Packages of this shape are low-footprint: a config block, an HTTP client wrapper, DTO mapping, and a framework service definition. That makes it easy to place behind an internal CompanyLookup interface — but also means it brings little architecturally we couldn't own ourselves in ~200 lines. The v1.1.1 change is a single PR updating a default API_URL, i.e. a configuration constant, not a feature or refactor.
Integration feasibility. Trivially installable; the concern is where it binds. The -bundle suffix strongly implies a Symfony Bundle (DI extension + services.yaml), not a Laravel package with a ServiceProvider and publishable config. The request frames this as a Laravel/PHP package; that framing is unverified and is the single biggest feasibility question. If it is Symfony-only, Laravel consumption means either (a) using the framework-agnostic core classes directly and writing our own binding, or (b) not using it at all.
Technical risk.
lucalbert, this being PR #3, v1.1.0 → v1.1.1). Bus factor of one; no evidence of CI or test coverage in the release notes.composer update silently redirects production traffic. That is a red flag on release discipline even if the fix itself is correct.Key questions.
ServiceProvider, or is this Symfony-only? What is the actual composer.json require block (framework packages, PHP constraint)?API_URL, and is it overridable via config / env in both?Stack fit. Uncertain pending question 1. If Symfony-native, it fits a Symfony service cleanly and should be avoided in Laravel. In a Laravel codebase, the pragmatic path is to depend on the package only as a plain-PHP HTTP client (or skip it and write a ~1-file Guzzle client against the documented INSEE endpoints), then register it in our own AppServiceProvider behind our own interface. That keeps the vendor swappable and removes the framework-binding risk entirely.
Migration path. Greenfield: no migration, just pin ^1.1.1 explicitly — do not float ^1.1.0, which is the version that likely shipped the stale URL. Brownfield: treat v1.1.1 as a config change, not a code change. Diff the default URL, verify any published config file we own still points at a live endpoint, and re-run smoke tests against the INSEE sandbox before promoting.
Compatibility. Verify three things against our lockfile before committing: PHP constraint vs. our 8.x matrix, Guzzle/symfony/http-client version range vs. our existing HTTP stack, and PSR-18/PSR-17 conformance if we want to reuse our shared HTTP client (proxy, retries, telemetry). Any of these can turn a "small bundle" into a dependency-resolution fight.
Sequencing.
composer.json — settle framework binding and PHP/dependency constraints.CompanyLookup port; wrap the vendor behind it.Maintenance. Low ceremony, high vigilance. Expect near-zero upstream churn punctuated by emergency-adjacent patches like this one. Realistically we should budget for either owning a fork or accepting that we will re-verify the INSEE endpoint on every dependency refresh. Given the small code surface, vendoring the client ourselves is a defensible alternative within one sprint.
Support. No commercial support; GitHub issues only, on a repo with a single maintainer. We need an internal runbook covering INSEE auth failure, quota exhaustion, and — importantly — that SIRENE returns HTTP 404 for a non-existent SIREN rather than an empty result. That distinction drives user-facing behavior and is exactly the sort of thing that gets lost without a runbook.
Scaling. Throughput is bounded by INSEE's per-application rate limits, not by this package; the package itself is stateless and horizontally safe. A per-SIREN cache (Redis, TTL keyed to SIRENE's daily refresh) and a nightly bulk-diff job are effectively mandatory — synchronous per-request lookups will hit quota on any meaningful traffic. Treat this package as the transport, not the data strategy.
Failure modes. (1) Upstream endpoint or API-version change — precisely what v1.1.1 patches; (2) OAuth token expiry or credential rotation; (3) silent default-config drift during patch upgrades; (4) rate limiting under load spike; (5) data staleness if we cache too aggressively; (6) abandonment — no successor maintainer, no security patch path.
Ramp-up. A mid-level engineer integrates this in an afternoon. The real cost is domain literacy, not code: SIREN vs. SIRET, legal unit vs. establishment, diffusible / active-vs-closed states, and the INSEE nomenclature. Allocate the learning time to the domain model and the caching layer; the bundle itself will not be where the effort goes.
How can I help you explore Laravel packages today?