sunra/turbosms-bundle
Symfony bundle for integrating TurboSMS into PHP applications, with configuration and services for sending SMS messages through the TurboSMS API.
Architecture fit — poor. sunra/turbosms-bundle is a Symfony2 bundle (SunraTurbosmsBundle), not a Laravel package. It is built around Symfony's kernel/DI conventions: a DependencyInjection/*Extension class, a Configuration tree, service definitions injected into the Symfony container, and likely a services.xml/services.yml. Laravel has no bundle registry — integration would require the package's service definitions to be re-expressed as a ServiceProvider with bindings and a publishable config file. In practice, you install nothing and rewrite the ~200–400 line wrapper.
Integration feasibility — low directly, moderate indirectly. The bundle's real substance is a thin adapter over the TurboSMS SOAP gateway (token auth, sendSMS, getMessageStatus, getBalance). That contract is easily reproduced with Laravel's Http client or a small SoapClient wrapper. Estimated port effort: 2–4 engineer-days including tests, versus an open-ended cost of forcing a 2016 Symfony package into a modern Laravel container.
Technical risk — high.
symfony/framework-bundle constraint will either be unsatisfiable or force a dependency downgrade cascade. This is a hard blocker, not a nuisance.ext-soap, which is not universal in containerized PHP-FPM images.config.yml/parameters.yml — an anti-pattern against Laravel's .env + config/services.php discipline.Key questions before any decision:
ext-soap available in our base image?Verdict: Do not adopt as a dependency. Treat the repository as a reference specification for the TurboSMS API contract and reimplement the client natively.
Stack fit. There is no fit as-is. Recommended pattern is extract, don't install:
app/Services/Sms/TurboSmsClient.php — wraps Illuminate\Support\Facades\Http (or SoapClient if SOAP is unavoidable), reads config('services.turbosms.*').app/Services/Sms/TurboSmsMessage.php — value object (recipients, body, sender, unicode flag).app/Notifications/Channels/TurboSmsChannel.php — implements send() against a TurboSmsMessage, registered via Notification::extend or a via() channel string.TurboSmsServiceProvider — binds the client as a singleton; credentials sourced from .env (TURBOSMS_TOKEN, TURBOSMS_SENDER).ShouldQueue; never call the gateway inline in a web request.Migration path. There is no data to migrate — the bundle defines no entities, tables, or migrations. Migration is purely code-level and can be done greenfield: the Laravel implementation replaces the bundle before it is ever installed. If a legacy Symfony service is already using it, the two implementations can coexist behind a shared interface, but there is no reason to bring the bundle into the Laravel codebase.
Compatibility. This is the decisive constraint. Verify before sprint commitment:
symfony/framework-bundle constraint vs. Laravel's transitive Symfony version. Expect composer require to fail or propose destructive downgrades.ext-soap availability across local, CI, and production images.Sequencing.
php artisan tinker — validates auth, payload shape, response codes (½ day).Maintenance. We inherit full ownership of a ~300-line integration. That is a feature, not a cost — an internally owned client tracks our PHP version, our logging, and our testing conventions, whereas the upstream package will never receive another commit. Budget a small recurring allowance for TurboSMS API changes (they are infrequent) and provider contract renewals.
Support. No upstream maintainer, no issue tracker activity since 2016, no security disclosure channel. Escalation is entirely internal plus TurboSMS's own account support. This must be documented in the service's runbook: named owner, escalation path, provider account contacts.
Scaling. Throughput is bounded by TurboSMS rate limits and per-message cost, not by the package. Design implications:
getBalance) and alert on low credit — a classic silent-failure mode for SMS.Failure modes to design against.
Ramp-up. Low technical complexity: the integration surface is four or five methods. Any mid-level Laravel engineer can own it within a sprint given the documented API contract. The genuine risk is knowledge concentration around TurboSMS's quirks (encoding rules, alpha-name approval, response-code semantics), which is mitigated by tests-as-documentation and a short ADR capturing why the bundle was rejected in favor of a native client.
How can I help you explore Laravel packages today?