v3.2.1 is a compatibility release — the headline change is declared support for Laravel 10. Treat it as an upgrade-safety patch rather than a feature drop, and start by confirming the constraint actually changed:
Check the composer constraint before upgrading.
composer show <vendor>/<package> --all | grep -A2 requires
You want to see illuminate/support (and friends) widened to include ^10.0. If the package still pins ^9.0, the release note is claiming something the manifest doesn't deliver.
Upgrade in a branch, not on main.
composer require <vendor>/<package>:^3.2 --with-all-dependencies
php artisan vendor:publish --provider="<Vendor>\<Package>\<PackageServiceProvider>"
Re-publish only if the config file changed — diff it against your existing config/ entry rather than overwriting.
Where to look first: the package's UPGRADE.md/CHANGELOG.md for the 3.2.x entries, then the service provider to confirm what is still auto-discovered. Laravel 10 kept package auto-discovery intact, so the provider should register without a config/app.php edit.
First use case: run your existing app test suite against the bumped dependency before writing new code. That is the only meaningful signal that the Laravel 10 support is real for your usage. If you have no coverage of the package's touchpoints, add a smoke test that boots the provider and hits one facade/endpoint.
Because this release is narrow, the day-to-day patterns are about adopting the version safely and keeping your CI honest.
Pin and stage the upgrade. Use ^3.2 in composer.json so future patches land, but lock the first upgrade deliberately:
composer require <vendor>/<package>:^3.2 --with-all-dependencies
composer why-not <vendor>/<package> ^3.2 # surfaces blocking deps
Run a CI matrix. If you maintain a package or a multi-app monorepo, this is the release that justifies a Laravel 10 job:
matrix:
laravel: [9.*, 10.*]
php: [8.1, 8.2]
Use orchestra/testbench at the matching major (^8 for Laravel 10, ^7 for Laravel 9) — mixing these is the most common cause of "it works locally, fails in CI."
Prefer container resolution over facades in new code. Nothing in a compatibility release changes this, but if you are touching integration points anyway, resolve the package's contracts from the container so future breaking changes are a single binding swap rather than a grep across the codebase.
Keep config publishing idempotent. In deploy scripts, run php artisan config:cache after vendor:publish, and never publish on every deploy — it will silently clobber environment-specific overrides.
Isolate the integration behind your own adapter. One class that wraps the package's public API means the next major (v4) touches one file.
^9.0|^10.0), not a replacement. A silent drop of Laravel 9 support is a breaking change hiding in a patch version — pin exactly if you still run Laravel 9 anywhere.php -v everywhere first.doctrine/dbal for change() on columns may have had to rework that path in this release. If you rely on column-modifying migrations that touch package tables, test them explicitly — this is the most likely place a "compatibility only" release actually changed behaviour.Illuminate contracts. Run with APP_DEBUG=true and watch storage/logs/laravel.log for deprecation notices during the first boot; they are cheap to fix now and expensive after the next major.composer why-not <vendor>/<package> 3.2.1 and composer depends <conflicting/package> will identify the blocker faster than reading the solver output. If the provider isn't loading, php artisan about and php artisan package:discover -v confirm discovery.config:clear, route:clear, view:clear, then re-cache. A stale bootstrap/cache/config.php will make you debug a problem that no longer exists.composer diff or a tag comparison on the repo) before assuming a zero-risk patch.How can I help you explore Laravel packages today?