Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Sms Laravel Package

ibrand/laravel-sms

ibrand/laravel-sms is a Laravel package that simplifies sending SMS messages from your application. It provides a consistent API for working with SMS gateways, so you can plug in a provider, send notifications or verification codes, and keep SMS logic cleanly separated from your business code.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. ibrand/laravel-sms follows the idiomatic Laravel "manager + driver" pattern: a package service provider, a facade, a config file enumerating gateways (Aliyun, Tencent Cloud/Qcloud, Yunpian-class providers), and a per-gateway driver class behind a common contract. It also ships a Notification channel, so via(['sms']) works alongside mail/database for OTP and transactional flows. For a Laravel codebase this is a recognizable, low-conceptual-overhead shape — the integration surface a mid-level Laravel engineer already understands. It is a fit architecturally but not a modern fit: the design idiom is 2018–2019 Laravel (5.5–6.x era), predating Laravel 8+ job batching, native rate limiting helpers, and typed property conventions.

Integration feasibility. Feasible only after a compatibility audit, and the burden of proof is on the package. Three gates must pass before any sprint commitment:

  1. composer.json constraints must admit your illuminate/support and PHP version. Given the last release date (2020-01-08), expect ^5.5|^6.0 and PHP ^7.1 — i.e., a hard block on Laravel 9/10/11 and PHP 8.1+, or at best an untested "works on my machine" tolerance.
  2. Transitive provider SDKs (Alibaba Cloud, Tencent Cloud) must resolve without downgrading Guzzle/PSR-7 or colliding with SDKs you already use for OSS, push, or payments. On a real Laravel app this is where the package most often fails, not in its own code.
  3. Driver code must be audited for PHP 8 fatal risks: dynamic properties, strlen(null), implicit nullable parameters, loose == on response codes.

If any gate fails, you are forking or wrapping — treat that as the planning baseline, not the contingency.

Technical risk. High, concentrated in abandonment rather than in the code itself. Last release over five years ago, 68 stars, zero dependents: there is no field validation, no security patching, no PHP-version upkeep, and no one to answer a question when a provider changes a response envelope. The domain (SMS gateways) is unusually stable — provider HTTP APIs for OTP sends change rarely — so the code may still work; the risk is that nothing around it does. Additional risks: credentials typically live in config/services.php with no rotation story; no idempotency key, so a client timeout followed by a retry sends and bills two messages; no built-in failover across gateways even though multiple gateways are configured; Chinese-language documentation and provider console workflows assume China-region accounts, signature (签名) and template (模板) pre-approval, and RMB billing — none of which a non-China team can self-serve quickly.

Key questions to resolve before approval.

  • Is our target Laravel/PHP combination inside the package's declared constraints, or are we committing to a maintained fork on day one?
  • Who owns that fork, and what is the trigger for upstream divergence (PHP 8.4, Laravel 12, provider API v3)?
  • Do we need domestic-China delivery specifically, or global? The package is China-provider-centric; if we need Twilio-class global routing, much of its value evaporates.
  • What is the cost of one duplicate OTP message versus the cost of a missed one? That asymmetry sets retry/idempotency requirements.
  • Is there an existing notification abstraction in our app we should target instead, keeping the vendor choice swappable?

Integration Approach

Stack fit. Evaluate against a written matrix, not a vibe:

Check Pass condition Typical outcome here
Laravel version constraint Includes our major Usually fails on 9+
PHP version 8.1+ in constraints and CI Usually fails
Guzzle/SDK conflict composer why-not clean Often fails
Notification channel Works with current Laravel Needs patch
Provider list Covers our target geos Pass (China only)

If two or more rows fail, the recommendation is do not adopt as a dependency. Instead, adopt it as reference material: lift the driver contract and the per-gateway response-mapping logic, and reimplement against a maintained transport.

Migration path. Insert an application-owned interface before any package touches the domain: SmsSender::send(Template $template, Recipient $to, array $data): SmsResult. Everything above that boundary — OTP issuing, rate limits, verification, audit logging — is ours and package-agnostic. Behind the boundary, either the forked ibrand drivers or a maintained alternative (e.g. wrapping overtrue/easy-sms in a small Laravel service provider, or Laravel's own Notification with a custom channel). This costs roughly two engineer-days and buys the ability to swap vendors, add a secondary gateway for failover, and survive the package's death — which, given no upstream activity since 2020, is a scheduled event rather than a risk.

If we are already running the package somewhere, do not rip it out mid-quarter. Freeze it, put the interface in front of it, and migrate drivers behind the interface as providers are touched. Greenfield: skip the package.

Compatibility. If retaining the package, vendor it: fork under our org namespace, add a CI matrix for the PHP/Laravel versions we actually run, pin provider SDK majors in composer.lock, and add a PHP 8 attribute/deprecation pass. Record the exact vendor SDK versions in the runbook — the most likely production break is an unrelated composer update bumping a cloud SDK, not the SMS code itself.

Sequencing. (1) Two-day spike: install against our real composer.json, send one live OTP to a test number per target provider, capture latency and failure shape. (2) Define SmsSender and SmsResult; write contract tests against a fake. (3) Decide fork-vs-alternative on spike evidence, with the fork named as a line item in the roadmap, not a footnote. (4) Wire the Notification channel so OTP and transactional messages share one path. (5) Provider onboarding: account, signature, template approval — run this in parallel with (1)–(4), because approval lead times, not code, set the delivery date. (6) Observability and failover last, but before launch, not after.

Operational Impact

Maintenance. There is no upstream maintenance to free-ride on. Budget an owner — a named engineer, ~10% of a sprint per quarter — for dependency bumps, PHP upgrades, and provider API drift. If that owner does not exist, the honest answer is that this package should not be in production. Fork tax is real but bounded: the code surface is small (drivers plus a manager), so a fork is a few hundred lines to own, not a subsystem.

Support. Community support is effectively nil: 68 stars, zero dependents, no recent issues activity, Chinese-language docs. Escalation for "alias failed" or "template rejected" runs through the provider's console and support channel, not the package — plan for that, and make sure someone on the team can read the console's Chinese UI and understands 签名/模板 approval semantics.

Scaling. Throughput is a non-issue: OTP volume is low QPS and every provider imposes per-account rate limits long before Laravel does. The real scaling constraints are (a) template and signature approval lead time per provider per region, measured in days, which gates launches; (b) per-provider quota and per-number/per-IP rate limiting, which you must implement yourself above the package; (c) cost per message and per failed attempt, so retry policy is a finance decision as much as an engineering one.

Failure modes to instrument. Provider returns HTTP 200 with a non-zero business code that the driver maps to true — silent failure, the worst case for OTP. Timeout on send followed by retry — duplicate, billable, and confusing to the user. Template ID or signature mismatch after a provider-side change — instant 100% failure with a clear error, so easy to catch. Credential expiry or rotation without redeploy. Provider outage with no configured secondary — the package supports multiple gateways but does not fail over automatically, so the failover is code we write. Rate-limit 429s under a burst — need queueing and backoff.

Ramp-up. A Laravel engineer is productive on the code in half a day; the package is small and conventionally shaped. The expensive ramp-up is environmental: provider account setup, real-name/business verification, signature and template submission, sandbox versus production behavior differences, and international-versus-domestic routing rules. Allocate one to two weeks calendar time for the first provider to be live, most of it waiting rather than building, and write the runbook (rotate credentials, add a provider, diagnose a failed send) during that wait.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels