solitus0/dto-xlsx-generator
Generate XLSX spreadsheets from DTOs in Laravel and PHP. Define typed data objects, map columns, and export clean Excel files with minimal boilerplate—ideal for reports, admin exports, and scheduled downloads. Simple, typed, and framework-friendly.
This is the first tagged release (v0.1.1), so treat it as pre-1.0 software: the surface area may still move, and there is no upgrade guide to lean on yet.
0.x version is narrower than most people expect (^0.1 means >=0.1.0 <0.2.0), and patch releases under 0.1.x can still change behaviour. Pin "vendor/package": "0.1.*" and bump deliberately rather than floating.composer.json for extra.laravel.providers / extra.laravel.aliases. If present, Laravel registers it for you; if not, add it to bootstrap/providers.php (Laravel 11+) or config/app.php.php artisan vendor:publish --provider="Vendor\\Package\\PackageServiceProvider" and read what lands in config/. Look for a migrations/ or database/ stub too — publish before running php artisan migrate, never after.README.md (quickstart), CHANGELOG.md, the service provider (that is where bindings, singletons, config keys, and event listeners are actually declared), then the package's own test suite — tests are usually the only working examples in an initial release.Wrap it behind your own boundary. Create a thin adapter class in app/Services that is the only place the package's classes appear. When the API shifts in 0.2, you change one file instead of grepping the codebase.
Resolve from the container, don't new it up. Register your adapter in a service provider and inject it. Prefer constructor injection over the package facade in application code; facades are convenient in controllers and Blade but they make tests and static analysis harder. If the package ships a facade, its alias belongs in config/app.php only on older Laravel versions — don't hand-edit it on Laravel 11+.
Configuration lives in config/ + .env. Put credentials and environment-specific values in .env, reference them from the package config file, and never commit the resolved config. If the package reads config('package.key') directly (most do), remember that config:cache freezes it — re-run php artisan config:cache in every deploy after changing env or published config.
Test against the package, not through it. If the package offers a fake()/swap() helper, use it. If not, bind a mock or stub of the interface in the container in setUp(). For packages with migrations, use RefreshDatabase and confirm the published migrations run in CI, not just locally.
Push I/O off the request path. Any package operation that hits a network, a queue backend, or an external API should be dispatched as a job. This also gives you retries and a dead-letter path for free.
Roll out behind a toggle. Add your own config('features.x') flag around the integration so you can disable it without a rollback if the initial release misbehaves in production.
0.x semver is not the semver you're used to. Minor bumps may break; patch bumps may change defaults. Read the diff between tags (git diff v0.1.1..v0.1.2 -- src/) before upgrading — there's no upgrade guide to tell you what happened.php artisan config:cache. A stale cached config is the single most common cause of "the new option does nothing."php artisan package:discover (and composer dump-autoload) and check bootstrap/cache/packages.php.register() must not touch config that hasn't been merged yet; if something reads null from config at boot, that's usually why. Defer to boot() for anything config- or route-dependent.storage/logs/laravel.log plus Telescope (if installed) for the actual exception — initial releases often throw unwrapped driver/connection exceptions.0.1. Grep the source for dispatch(, ::macro, and $this->app->bind before you build on them.1.0 tag exists, the stability guidance above should be re-evaluated.How can I help you explore Laravel packages today?