superinteractive/statamic-super-sections
Super Sections is a Statamic addon for creating reusable, configurable page sections and composing flexible layouts from them. It streamlines section-based content modeling, reduces repetitive field setup, and keeps sites editor-friendly and maintainable.
Since v1.1.0 is the initial release, treat this as a greenfield onboarding rather than an upgrade. Start with the package's README.md and CHANGELOG.md, then check composer.json for the supported Laravel/PHP version constraints before installing.
Minimal steps:
composer require <vendor>/<package> (pin to ^1.1 until you've validated stability).config/app.php (Laravel 10 and below) or bootstrap/providers.php (Laravel 11+).php artisan vendor:publish --provider="<Vendor>\<Package>\<Package>ServiceProvider".php artisan migrate.tinker before wiring it into application code.First use case: pick the smallest read-only path (e.g. a resolve()/->get() call, a single facade method, or a single artisan command) and confirm it works end-to-end before adopting it for write operations or queue-driven work.
Resolve from the container, don't new it up. Inject the package's main contract/class through the constructor rather than instantiating it directly — that's what makes the package swappable and mockable later.
Wrap it in your own adapter. Even a thin service class (App\Services\FooService) that delegates to the package keeps vendor calls out of controllers, jobs, and models. If you ever swap the package or upgrade past a breaking change, you change one file.
Use the facade for terse call sites, the injected instance for testable ones. Facades are fine in Blade/controllers; injected instances are better in jobs and services where you want to mock without Facade::shouldReceive().
If the package exposes events, listen rather than poll. Many Laravel packages dispatch domain events (PackageEvent::class) — hooking those into listeners keeps your code decoupled from the package's internal API surface.
Queue long-running operations. If the package offers a sync driver and a queue driver, default to queue in production and only use sync in tests.
Testing. Use the package's fake() equivalent if it exists; otherwise bind a mock into the container in setUp() and assert on the contract, not the concrete class.
php artisan config:cache. If you're reading env vars inside the package config file, do it only there — env reads elsewhere return null in production.Facade::shouldReceive() won't catch signature drift after an upgrade. Pair your facade mocks with at least one integration test that hits the real container binding.php artisan migrate:status after install; rename with a later timestamp if foreign keys fail.1.1.0, the public API is still forming. Pin to ^1.1 in composer.json and read each CHANGELOG.md before minor bumps — semver on 0.x/early packages is often aspirational.vendor:publish --tag=config vs --all differ; publishing everything can overwrite your app's own stubs. Prefer tagged publishes.php artisan about confirms the provider is loaded; php artisan package:discover re-runs discovery if you've added it manually. Enable the package's own debug/log channel in config/logging.php rather than dumping inside the package.Manager class, extend() method, or a contracts namespace). Those are the sanctioned places to customize behavior without forking.How can I help you explore Laravel packages today?