The headline for 2.2.0 is Laravel 11 support, so treat this release as the minimum version for any Laravel 11 application and confirm the constraint before anything else.
composer.json and verify it now allows laravel/framework ^10.0|^11.0 (or ^11.0 if 10.x was dropped) and that php is ^8.2. A changelog line saying "Laravel 11 support" is only true if the constraints actually permit it.composer require vendor/package:^2.2 in a fresh laravel/laravel:^11.0 skeleton. If resolution fails, composer why-not vendor/package 2.2.0 tells you which transitive dependency is blocking it far faster than reading the solver output.php artisan vendor:publish --provider="Vendor\Package\ServiceProvider"), the service provider's register()/boot(), and any migrations the package ships. Those three are where Laravel 11's skeleton changes bite.orchestra/testbench ^9.0 before wiring it into your app. If the package has no L11 test matrix, you are the test matrix.Upgrade path for existing installs. Bump the constraint on a branch, then composer update vendor/package --with-dependencies, run your app's test suite, and only then merge. Do not combine this with a framework upgrade in the same PR — if something breaks you want to know which side caused it.
Dual-version support. If you maintain an app on 10.x and another on 11.x, keep the package constraint permissive and let CI pin the framework: a matrix of laravel/framework:^10.0 and ^11.0 against the same package version is the cheapest way to catch a regression that only shows on one side.
Provider registration. Laravel 11's slim skeleton has no config/app.php providers array. Package auto-discovery still works, but if you register the provider manually it belongs in bootstrap/providers.php. Same story for middleware aliases and route middleware — those now live in bootstrap/app.php via ->withMiddleware(), not app/Http/Kernel.php.
Config and environment. Publish the config in your deploy pipeline rather than committing it, and read package settings through config() — not env() — so php artisan config:cache doesn't silently return nulls in production.
Testbench for package-level tests. If you're consuming the package inside a larger app, a small testbench harness that boots the provider and asserts the published config/migrations is worth the setup; it catches L11 boot-order changes cheaply.
php -v before you file anything.illuminate/support to 10.x. composer why-not resolves this in seconds.change() on columns. If the package touches schema mutation, that's precisely the kind of thing 2.2.0 had to address — verify the migration path on a fresh database, not just an existing one.php artisan config:clear && php artisan cache:clear after upgrading; stale cached config is the single most common false-negative when a package version changes.boot(), container bindings (interfaces resolved by the provider), and any Macroable classes are the supported seams. If your customisation reaches past those, you're on borrowed time at the next major.How can I help you explore Laravel packages today?