smsup/smsup-api-bundle
Symfony bundle for integrating the SMSUP API into PHP applications. It provides configuration and service wiring to help connect your Symfony project to SMSUP and send SMS messages with less setup.
Architecture fit
The package is a Symfony 2 bundle, not a Laravel package. That distinction is the whole evaluation. Bundles are bound to Symfony's HttpKernel, DependencyInjection component and Resources/config/services.yml conventions; Laravel has no bundle loader, no AppKernel registration, and no equivalent extension lifecycle. There is no service provider, no extra.laravel auto-discovery block, and no facade. Out of the box it is not installable into a Laravel application in any supported sense.
The functional payload, however, is likely small: an HTTP client that posts a destination number, a sender ID and a message body to smsup.es with an API key, then parses a response. That is the only part worth having. The realistic architecture decision is do not integrate the bundle — extract the API contract and reimplement the transport in Laravel-native code. Estimated effort: 100–200 lines behind an interface.
Integration feasibility
Feasibility splits sharply depending on one unknown: whether the repository contains a container-agnostic client class (e.g. a plain Smsupapi/Client object with constructor-injected credentials) alongside the Bundle and DI extension classes. If it does, you can vendor or copy just that class and skip Symfony entirely. If all logic lives inside container-configured services, the bundle has near-zero salvage value and you are effectively reverse-engineering the HTTP calls from source.
Either way, copying source is preferable to composer require. Composer resolution is the primary blocker: Symfony 2-era bundles pin PHP constraints around 5.3–5.5 and typically pull Guzzle 3.x/5.x or Symfony 2.x components, all of which are EOL and will conflict with PHP 8.1+ and Laravel 9+. --ignore-platform-reqs gets the code onto disk but not into a supported dependency graph.
Technical risk
Key questions
Stack fit
Target: Laravel 10/11, PHP 8.2+, Guzzle 7 via the Http facade. The bundle's own stack (Symfony 2, PHP 5.x) is two major eras behind. There is no version of this package that is a peer dependency of a current Laravel app.
Migration path Recommended path is reimplementation, not migration:
composer require --ignore-platform-reqs in a scratch directory) purely to extract: base URL, endpoint paths, auth header/param name, request fields, response shape, error codes.App\Services\Sms\SmsupClient implementing an SmsSender interface with a single send(string $to, string $body): SendResult method.SmsServiceProvider, config in config/services.php, secrets in .env (SMSUP_API_KEY, SMSUP_SENDER_ID).Direct bundling is only defensible if the spike reveals a clean, self-contained client class with no Symfony imports — in which case copy that one file with attribution, drop the Bundle class, the DI extension and Resources/config, and wrap it.
Compatibility
| Concern | Assessment |
|---|---|
| Laravel auto-discovery | Absent — manual wiring required |
| PHP 8.x | Likely fails declared constraints |
| Guzzle version | Likely conflicts with Laravel's Guzzle 7 |
| Service container | Incompatible (ContainerBuilder vs Illuminate\Container) |
| Facade / config publishing | Not provided |
Sequencing Half-day spike to answer the six questions above → decision gate (reimplement vs. adopt official SDK) → adapter + interface → feature tests against a faked HTTP client (never hit the live provider in CI) → queue integration with backoff → observability → provider-lock review at 90 days.
Maintenance You own 100% of it. Upstream is dormant; there is no one to send a CVE to and no one to merge a PHP 8 fix. Budget the reimplementation as your own code with your own test coverage, and record the provenance (source URL, date copied, what was changed) for licence hygiene.
Support Package support: none. Vendor support for the smsup.es API itself is a separate and likely better channel — escalate API questions to the provider and treat the repository as documentation of last resort. The 0-dependents figure means there is no Stack Overflow surface and no one else has hit your bug.
Scaling
Throughput is governed by the provider's rate limits and your account tier, not by the package — which is synchronous and will block the request cycle. Route all sends through Laravel queues with per-provider rate limiting (RateLimited job middleware) and a dedicated queue so SMS backlogs never starve other work. At Spanish-market volumes this is usually tens to low thousands per day; the queue is about latency isolation and retry control, not raw throughput.
Failure modes
SmsSender interface exists to make a second provider a config change.Ramp-up
Low for any PHP developer — a single HTTP call and a response parser. The real onboarding cost is the trap: a package on Packagist with a version number reads as maintained. Document explicitly in the repo that this is vendored source with no upstream, so a future developer does not attempt a composer update and spend a day on a dependency graph that cannot resolve.
How can I help you explore Laravel packages today?