iivannov/gauge
Gauge is a lightweight Laravel package that helps you define and track application metrics through a clean, expressive API, making it easy to record values and monitor trends without adding heavy monitoring infrastructure.
composer require <vendor>/<package> and let Laravel's package auto-discovery register the service provider. If the package predates discovery or you need conditional registration, add it manually to bootstrap/providers.php (Laravel 11+) or config/app.php.php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider"
php artisan vendor:publish --tag=package-config
php artisan vendor:publish --tag=package-migrations
Publish selectively — config and migrations almost always; views/assets only if you actually intend to override them.composer show <vendor>/<package> for the installed version against the changelog/UPGRADE notes so you know which doc section applies to you..env, resolve the package's main entry point from the container in php artisan tinker, call the single simplest method, and confirm the result. Once that round-trip works, wire it into one real code path (a controller action, a queued job, or a console command) and verify with a feature test. Do not scaffold broadly until that one path is green.new. app(Client::class), constructor injection, or the facade — whichever the package documents. Instantiating directly bypasses config, HTTP client customisation, and any shared state the provider sets up.App\Contracts\Geocoder) and a single implementation that delegates to the package. Everything else in your app type-hints the interface. This is the cheapest insurance against a future major version or a swap-out, and it makes faking in tests trivial.$tries, backoff(), and failed() handling. Use ShouldBeUnique where duplicate dispatch would cause double side effects.EventServiceProvider rather than scheduling a cron to check state.config/package.php reading from env(), and put per-tenant/per-request values in method arguments or a scoped instance. Never resolve config at class-construction time if it can change per request.Facade::swap() or $this->instance(Interface::class, $fake) in the container; Http::fake() if the package sits on the HTTP client; Queue::fake()/Event::fake() to assert dispatch rather than execution.env() outside config files returns null once config:cache runs. If the package reads env() directly, it will silently break in a cached production deploy but work locally. Audit the package for direct env() calls and mirror those values into your own config if needed.php artisan config:clear after publishing config or editing .env; a stale cache is the single most common "the package ignores my settings" cause.vendor/<vendor>/<package>/config/... after every minor bump and merge deliberately.vendor:publish --force will overwrite your edits. Re-run with --force only when you have nothing local to lose, or publish to a versioned path and diff.php artisan about and php artisan package:discover -v help you see what's actually registered.scoped() bindings in your own wrapper.Facade::swap() persists for the process; reset in tearDown() or prefer container instance() bindings, which Laravel restores automatically.php artisan config:clear, (2) php artisan tinker and resolve the class to confirm it's the real implementation and not a stub, (3) Log::debug() around the call site, (4) Http::fake()/Event::fake() in a test to isolate whether the failure is in the package or in your wiring.extend(), container rebinding of an interface the package type-hints, Macroable traits, and publishable stub/contract classes. Most day-to-day customisation should be achievable through these rather than a fork."^1.1" rather than "*") and re-run your integration test suite on every bump — especially across minors, where published-asset drift and config-key renames are the usual breakage.How can I help you explore Laravel packages today?