canvural/laravel-e2e-routes
Expose your Laravel routes to end-to-end test suites. Generates a JSON route manifest so Cypress, Playwright, or Dusk tests can resolve named routes and URLs without hardcoding paths, with an artisan command and configurable filtering to keep sensitive routes out.
composer show vendor/package for the version, Laravel/PHP constraints, and whether the tag is a real 1.0.0 or a dev- branch alias. On a "v1.0.0 — Initial release," the tag is a promise, not evidence.ServiceProvider (what is bound, what is auto-discovered, what is publishable) → config/*.php (the real public API surface) → migrations/routes/views → tests/ (the best documentation a v1.0.0 has).php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider" --tag=config
php artisan about
php artisan package:discover --ansi
php artisan config:clear
new the class. At v1.x, the concrete class name is the most likely thing to change:public function __construct(private Vendor\Package\Contracts\Client $client) {}
// app/Providers/PackageServiceProvider.php
public function register(): void
{
$this->app->when(ReportGenerator::class)
->needs(Client::class)
->give(fn () => new Client(config('services.package.key')));
}
config/services.php (env-backed) over editing the published package config for credentials, so config:cache in deploy stays predictable. Leave the published file for behavioural defaults you want to override explicitly.App\Support\Billing) that your app depends on instead of the vendor namespace. Replacing the dependency then becomes a one-file change.Http::fake():$this->app->instance(Client::class, new FakeClient());
"vendor/package": "1.0.*") until you've read a 1.1 changelog; pre-2.0 semver permits renames and signature changes.composer update: run php artisan package:discover locally, and in deploy run composer install --no-dev then config:cache → route:cache → view:cache in that order.vendor/.../config/*.php before each minor bump, and commit the diff deliberately.timeout, retry, debug, log_payload, sandbox, and base URLs — these are the values that fail in production at 3am.loadMigrationsFrom (package-owned, never edit) from published migrations (yours, own them). Mixing the two is the classic v1 upgrade wound.app(Vendor\Package\Client::class)) to see the real concrete class, and log inside your decorator. v1 packages rarely log usefully on their own.Macroable, an injectable HTTP client/transport, or an interface resolved from config. If none exist and you need customisation, open an upstream issue early — private forks become maintenance debt fast.Facade::shouldReceive() to make tests pass — it hides binding errors that will surface in production. Use constructor injection in app code and reserve the facade for views and throwaway scripts.How can I help you explore Laravel packages today?