orkestra/webservice-bundle
A Laravel package from the Orkestra ecosystem that bundles web service tooling, giving your application a structured foundation for exposing APIs and handling web service requests with clean, framework-integrated configuration.
composer require vendor/package — Laravel's package auto-discovery should register the service provider and any facades via extra.laravel in the package's composer.json. Verify with php artisan about or by checking bootstrap/providers.php (Laravel 11+) — if it's not listed, register it manually.php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider". Look for tagged publishes (--tag=config, --tag=migrations, --tag=views) — publishing by tag is safer than a blanket publish because it won't dump assets you don't need.config/package.php → src/PackageServiceProvider.php. The config file is the fastest map of what the package can actually do; the service provider tells you what it binds, what it registers, and which extension points exist.php artisan migrate if migrations were published, then resolve the class once in php artisan tinker (app(Vendor\Package\Client::class)) to prove the container binding and credentials work.app(...), constructor injection, or the facade). Constructing with new bypasses config, HTTP client customisation, and any test doubles the package registers.App\Services\... class in front of the package and inject that everywhere. The facade is convenient but it's a global; an adapter gives you one place to change when the package renames methods or you swap it out..env and have the published config read them via env(). Everything else belongs in the config file, which is version-controlled and diffable.AppServiceProvider method or a small package-specific provider — not in AppServiceProvider::boot() mixed in with unrelated code.Package::fake() or an interface you can bind a stub to in the container. Prefer that over Http::fake() unless the package is a thin HTTP wrapper; fakes survive internal refactors better.composer.json ("^1.0") and let patch/minor float. Given this is the 1.0.0 cut, treat the public API as now-stable and lean on semver for upgrade decisions rather than reading the changelog on every composer update.env() returns null after config:cache. Only call env() inside config files. If the package calls env() at runtime, you'll see it work locally and silently break in production — check for this first when "it works on my machine."vendor:publish --force will clobber a customised config. On upgrade, publish to a temp path or diff the package's config/package.php against yours rather than force-publishing.loadMigrationsFrom(), do not also publish its migrations — you'll get duplicate-table errors. Pick one: published (editable, yours to own) for app-specific schema, loadMigrationsFrom for package-internal tables.scoped or resolve per job.--no-scripts, or apps with a custom provider list, won't auto-register. Symptom: Target class [...] does not exist or a facade throwing "root not set."php artisan about (providers/config status), php artisan tinker to poke the resolved instance, Log::debug() inside your adapter to confirm what you're passing in, and php artisan config:clear before assuming the package is broken.UPGRADE.md/CHANGELOG.md for the target version, bump, run the full suite, then grep your code for any renamed or deprecated methods. Keep the adapter from the patterns section thin and this stays a 15-minute job.How can I help you explore Laravel packages today?