misaf/laravel-sms-gateway
Driver-based SMS gateway manager for Laravel with separate first-party packages for providers like Twilio, Vonage, Kavenegar, and more. Switch drivers per request, use Laravel’s HTTP client, listen for sent events, and register custom drivers.
Architecture fit
The package follows Laravel's own Manager pattern (analogous to MailManager/QueueManager): a thin core resolves a driver from config, drivers live in separate Composer packages, and sends emit events carrying request/response payloads. For a Laravel codebase this is idiomatic and low-friction — it will feel familiar to any engineer who has configured a Laravel mailer. The core/driver split is the strongest design decision: it keeps vendor SDK weight out of the base install and lets teams swap providers via config or per-request driver selection. Http-client-based drivers are testable with Http::fake(), and custom driver registration gives an escape hatch when a provider isn't covered.
Integration feasibility
Mechanically trivial: composer require the core, install one driver, publish config, set credentials. Realistically constrained: the stated floor is PHP 8.3+ and Laravel 13+, which excludes most production applications currently on Laravel 10–12. Unless the constraint is intentionally forward-looking and back-portable, adoption requires either upgrading the host app or forking the package to relax composer.json — both are non-trivial for a TPM to justify on a 1-star dependency.
Technical risk
opportunity: 6.35. There is no external validation that this works in production anywhere but the author's own app.dev-main.Key questions
Stack fit Best fit: greenfield Laravel 13 / PHP 8.3 services with modest SMS volume (OTP, transactional alerts) and a need to abstract one or more providers. Poor fit: mature Laravel 10/12 monoliths, apps needing enterprise support, or teams requiring audited dependencies.
Migration path
Do not couple application code to the package's facade or manager directly. Introduce an internal SmsSender contract (or a Laravel Notification channel) and implement it with this package behind an adapter. That preserves optionality: replacing the package later becomes an adapter swap rather than a codebase-wide refactor. Route all sends through queued jobs from day one so retry/backoff/throttling policy lives in your code, not the vendor's.
Compatibility
Before committing, run composer why-not misaf/laravel-sms-gateway against the target app, and inspect the core's constraints on illuminate/* and php. Verify each driver package's version aligns with the core version (core/driver version skew is a common failure in split-driver designs). Confirm the HTTP client version and Guzzle compatibility transitively.
Sequencing
Http::fake-based contract tests.Maintenance Treat this as a self-maintained dependency. With one maintainer and zero dependents, you are effectively the only consumer; expect to fork, patch, and carry upgrades yourself. Every additional driver package is another surface to track. Budget a recurring line item for dependency review, not just a one-time integration cost.
Support GitHub issues only; no SLA, no security advisory process evident, no commercial escalation. Internal ownership must be explicit — name an engineer accountable for the SMS integration and a runbook for provider outages.
Scaling The package is a stateless HTTP wrapper, so throughput is bounded by the provider's API limits, not by the package. Scaling concerns are yours to implement: queue workers, per-provider rate limiting, timeouts, connection reuse, and concurrency caps. Multi-provider failover is architecturally possible via per-request driver switching, but you must build the routing/failover logic and health checks yourself.
Failure modes
Ramp-up Low for a Laravel developer — the Manager pattern and config publishing are familiar, so a first send is an hour's work. The real ramp-up is operational: writing the adapter, queue policy, observability, and failover runbooks that the package intentionally does not provide. Documentation depth appears limited to README/changelog, so driver-specific behavior (return shapes, error codes) will need to be discovered from source and encoded in your own tests.
How can I help you explore Laravel packages today?