mibo/currencies
A Laravel/PHP package for working with currencies, offering helpers to define, format, convert, and validate currency codes and amounts in your applications.
Architecture fit
mibo/currencies is a reference-data library: it maps ISO-4217 currency codes to metadata (numeric code, minor unit/exponent, potentially name/symbol). Architecturally this is a leaf dependency — no framework coupling, no I/O, no persistence, no service provider expected. That is the safest possible position in the dependency graph, since it cannot constrain domain or persistence design. However, the architecture fit question is not "does it fit" but "does it earn a slot": its scope overlaps almost entirely with symfony/intl (already a transitive dependency of laravel/framework in most installations) and with moneyphp/money / brick/money, which ship currency data alongside arithmetic. Adopting it introduces a second, potentially divergent source of truth for currency metadata unless an adapter boundary is enforced.
Integration feasibility
Presumed PSR-4 autoloaded Composer package with static or simple instance accessors. Consumption from Laravel is trivial: bind a CurrencyRepository interface in a service provider and delegate to the package. Integration effort is hours, not days. The absence of framework integration (config publishing, validation rules, Blade directives) is not a defect — it is the correct scope for a data package — but it means the package delivers raw data only; any Laravel-idiomatic ergonomics are yours to build.
Technical risk Risk is high relative to the value delivered, for concrete reasons:
| Signal | Value | Interpretation |
|---|---|---|
| Stars | 0 | No community validation |
| Dependents | 0 | No production feedback loop |
| Score | 0 | No quality signals captured |
| Maintainer | Single | Bus factor of one |
| License | MIT | Permissive, no legal friction (only positive signal) |
The severity is not abandonment per se — it is silent incorrectness. ISO-4217 changes a handful of times per year: new codes (ZWG), redenominations (HRK→EUR), minor-unit/exponent revisions, fund and precious-metal code adjustments. A stale table yields a wrong decimal exponent, which produces 100× display and rounding errors in invoices, tax calculations, and payment payloads without throwing an exception. That is the worst failure class: no error log, no alert, just wrong money.
Equally, adoption implies a supply-chain decision: a small, unaudited, zero-coverage package is the standard attack vector for Composer-based incidents.
Key questions
^1.0 meaningful or is dev-main the only usable ref?symfony/intl or moneyphp/money?Stack fit Anticipated to work on PHP 8.x within Laravel 9–12, with no framework-imposed constraints. Verify Composer constraints explicitly rather than assuming; a stale PHP floor or an unpinned dependency is a common blocker for an unmaintained package.
Migration path
Adoption risk is low if the boundary is set at adoption time and not retrofitted. The real migration hazard is developers calling the package's static API (Mibo\Currencies\Currency::find(...)) directly across controllers, models, and jobs. Mandate an internal interface from day one:
App\Support\Money\CurrencyRepository (interface)
└── MiboCurrencyRepository (thin adapter)
Swapping to symfony/intl, a vendored table, or moneyphp/money later becomes a one-class change plus a container binding. Because the package is pure data, there is no data migration, no schema change, and no backfill — the swap cost is genuinely low if and only if the adapter exists.
Compatibility
Confirm two things: (a) the package does not conflict with symfony/intl's Currencies class or moneyphp/money's currency list at the Composer or namespace level; (b) if both are present, decide which is authoritative for minor units. Two sources of truth for exponents is a defect waiting to surface.
Sequencing
symfony/intl data already in the lockfile. If the diff is empty or trivial, the package adds nothing.Maintenance Runtime maintenance is effectively zero — static data, no runtime state, no configuration drift. The liability sits upstream: if the maintainer is dormant, you inherit the ISO-4217 tracking burden. Budget a quarterly review plus a one-line regression test update for the 2–5 changes the standard sees in a typical year. That is a small but permanent, non-delegable cost.
Support None. No vendor, no SLA, no documented support channel, and zero dependents means no Stack Overflow corpus or blog posts to fall back on. Escalation path is "read the source" — acceptable for a 200-line data table, unacceptable if the package is ever expected to do more.
Scaling A non-issue. In-memory arrays, no I/O, no per-request overhead beyond autoloading, and fully opcache-eligible. Behaves identically at 10 req/s and 10k req/s. Any per-request lookup should still go through a cached repository binding to avoid repeated array construction in hot paths, but this is hygiene, not a scaling concern.
Failure modes
composer install on clean builds and CI. Mitigation: commit composer.lock, and prefer a vendored table or a Composer repositories mirror if adopted.symfony/intl and this package are consulted in different code paths, results will eventually disagree. Mitigation: single adapter, single authority.Ramp-up Near-zero for engineers — the API surface is a lookup table, and onboarding cost is measured in minutes. The genuine ramp-up cost is governance, not learning: someone must own the adapter, the pinning policy, the regression tests, and the quarterly ISO review. For a package delivering a smallish, widely-replicated dataset, that governance overhead likely exceeds the cost of simply vendoring the table.
Recommendation: Do not adopt as a primary dependency at the current signal level (0 stars, 0 dependents, no visible CI or release history). The functional gap is already covered by symfony/intl in most Laravel installations and by moneyphp/money where arithmetic is needed. If a genuine gap exists — symbols, localized names, specific formatting — vendor the ISO table into the application under test, behind a CurrencyRepository interface, and refresh it on a schedule. That captures 100% of the value with none of the abandonment, supply-chain, or silent-drift risk. Revisit the package only if it publishes a changelog tied to ISO revisions, demonstrates CI and test coverage, and gains independent dependents.
How can I help you explore Laravel packages today?