gr8shivam/laravel-sms-api
gr8shivam/laravel-sms-api gives Laravel apps a unified interface for sending SMS through multiple gateways. Configure providers, switch gateways via config, and send messages with a simple, consistent API—ideal for OTPs, alerts, and transactional messaging.
^4.1; on Laravel 10–12 the earlier 4.x releases remain valid and you don't need to move. Commit the lockfile either way.vendor/<vendor>/<package>/src/*ServiceProvider.php before the README — it tells you what is bound into the container (singletons vs. scoped), what config is merged, which commands are registered, and which interfaces are the intended extension points.php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider" (or --tag=<package>-config), then read the published file top to bottom. Laravel package config files are usually the most accurate documentation of defaults and driver options.new. Your first real use case should be app(Client::class) / constructor injection in a controller, so the package's configured HTTP client, credentials, and test fakes actually apply. Hand-constructing the class bypasses all of it.php artisan about, php artisan list | grep <package>, and php artisan vendor:publish with no arguments will surface the commands, scheduled tasks, and publishable assets the package adds.config/<package>.php reading from env(), and never call env() at runtime — with config:cache it returns null. Per-environment driver swaps (sandbox vs. live) belong in config/<package>.php, not in application code.App\Services\<Thing> that depends on the package and exposes only the two or three methods your app needs. This gives you one place to update on the next major, and one thing to fake in tests.$tries, backoff(), and ShouldBeUnique (or a dedupe key) so retries and webhook re-delivery are idempotent. Use Bus::fake() and Http::fake() to assert behaviour without hitting the network.withoutOverlapping() and onOneServer() if you run more than one node.Package::fake()) first; otherwise fake the underlying HTTP or queue transport and keep one small integration test against the real container bindings so config wiring is covered.scoped rather than singleton in your own provider if you see state leaking between requests.composer update are typically transitive (symfony/*, laravel/framework sub-packages) rather than this package. Run composer why-not laravel/framework 13 before touching the package constraint.config/<package>.php against vendor/<vendor>/<package>/config/ after every minor bump; use vendor:publish --force deliberately and re-apply your customisations.bootstrap/cache/packages.php and run php artisan package:discover / composer dump-autoload. Stale discovery caches are the usual cause of "class not found" right after an upgrade.Http::globalRequestMiddleware) to log request/response pairs, and route its log channel somewhere separate — package debug logging is often noisy at debug level.$this->app->bind(...)), use the manager's extend() for a custom driver, and use Macroable classes if the package exposes them. These survive minor upgrades; a fork does not.How can I help you explore Laravel packages today?