Upgrading Composer packages in a PHP project can sometimes be a challenging task, especially when dealing with compatibility issues or dependency conflicts. Here are seven tricks to help smooth the process:
⭐ Use Composer’s Interactive Mode: Composer provides an interactive mode (composer update --interactive
) that allows you to selectively update packages. This is particularly useful when you want to upgrade specific packages without affecting others. It prompts you to choose which packages to update, providing a more controlled upgrade process.
composer update \
laravel/framework:~10.0.0 \ # allows for specific versions # allows for specific versions
spatie/laravel-ignition:^2.0 \
monolog/monolog \ # can only be a reference to allow an upgrade
spatie/ignition \ # we'll use the --with option to set a specific version
symfony/http-foundation \
symfony/mailer \
nesbot/carbon \
symfony/mime \
spatie/flare-client-php \
spatie/laravel-package-tools \
spatie/laravel-activitylog \
--with spatie/ignition:1.11.3 # our specific version for a sub dependency
⭐ Leverage Version Constraints: Specify version constraints in your composer.json
file to control which versions of packages your project can use. This allows you to set boundaries for compatibility and stability. For example, you can use ^1.0
to allow updates within the 1.x range while avoiding breaking changes.
⭐ Check for Deprecated Packages: Before upgrading, check if any of the packages you’re using are deprecated or have reached end-of-life status. Deprecated packages may have alternative solutions or migration paths you should consider before upgrading.
⭐ Review Changelogs and Release Notes: Always review the changelogs and release notes of the packages you plan to upgrade. This helps you understand what changes have been made, including bug fixes, new features, and potential breaking changes. Understanding these changes can guide you in assessing the impact of the upgrade on your project.
⭐ Use Composer’s --dry-run
Option: Before actually performing the upgrade, use the --dry-run
option (composer update --dry-run
) to simulate the upgrade process without making any changes. This allows you to see what would be updated and whether there are any potential conflicts or issues.
⭐ Find packages blocking updates. Another command that you can use before getting started is simply the why-not
command. It’s also called prohibits
but honestly why-not
just seems more memorable!
Now Laravel 11 is days away so let’s try seeing what it will take to get this current Laravel 10 project update to date.
peterfox@Peters-MBP-2 project % composer why-not laravel/framework 11.0.0
Package "laravel/framework" could not be found with constraint "11.0.0", results below will most likely be incomplete.
laravel/laravel dev-main requires laravel/framework (^10.0)
laravel/fortify v1.19.1 requires illuminate/support (^8.82|^9.0|^10.0)
laravel/jetstream v4.2.0 requires illuminate/console (^10.17)
laravel/jetstream v4.2.0 requires illuminate/support (^10.17)
laravel/octane v2.2.4 requires laravel/framework (^10.10.1)
laravel/sanctum v3.3.2 requires illuminate/console (^9.21|^10.0)
laravel/sanctum v3.3.2 requires illuminate/contracts (^9.21|^10.0)
laravel/sanctum v3.3.2 requires illuminate/database (^9.21|^10.0)
laravel/sanctum v3.3.2 requires illuminate/support (^9.21|^10.0)
laravel/scout v10.6.1 requires illuminate/bus (^9.0|^10.0)
laravel/scout v10.6.1 requires illuminate/contracts (^9.0|^10.0)
laravel/scout v10.6.1 requires illuminate/database (^9.0|^10.0)
laravel/scout v10.6.1 requires illuminate/http (^9.0|^10.0)
laravel/scout v10.6.1 requires illuminate/pagination (^9.0|^10.0)
laravel/scout v10.6.1 requires illuminate/queue (^9.0|^10.0)
laravel/scout v10.6.1 requires illuminate/support (^9.0|^10.0)
laravel/slack-notification-channel v3.1.0 requires illuminate/http (^9.0|^10.0)
laravel/slack-notification-channel v3.1.0 requires illuminate/notifications (^9.0|^10.0)
laravel/slack-notification-channel v3.1.0 requires illuminate/support (^9.0|^10.0)
laravel/tinker v2.8.2 requires illuminate/console (^6.0|^7.0|^8.0|^9.0|^10.0)
laravel/tinker v2.8.2 requires illuminate/contracts (^6.0|^7.0|^8.0|^9.0|^10.0)
laravel/tinker v2.8.2 requires illuminate/support (^6.0|^7.0|^8.0|^9.0|^10.0)
livewire/livewire v3.3.3 requires illuminate/database (^10.0)
livewire/livewire v3.3.3 requires illuminate/support (^10.0)
livewire/livewire v3.3.3 requires illuminate/validation (^10.0)
openai-php/laravel v0.4.3 requires laravel/framework (^9.46.0|^10.7.1)
spatie/laravel-ignition 2.3.2 requires illuminate/support (^10.0)
spatie/laravel-package-tools 1.16.1 requires illuminate/contracts (^9.28|^10.0)
spatie/laravel-ray 1.33.0 requires illuminate/contracts (^7.20|^8.19|^9.0|^10.0)
spatie/laravel-ray 1.33.0 requires illuminate/database (^7.20|^8.19|^9.0|^10.0)
spatie/laravel-ray 1.33.0 requires illuminate/queue (^7.20|^8.19|^9.0|^10.0)
spatie/laravel-ray 1.33.0 requires illuminate/support (^7.20|^8.19|^9.0|^10.0)
spatie/laravel-webhook-client 3.2.0 requires illuminate/bus (^8.50|^9.0|^10.0)
spatie/laravel-webhook-client 3.2.0 requires illuminate/database (^8.50|^9.0|^10.0)
spatie/laravel-webhook-client 3.2.0 requires illuminate/support (^8.50|^9.0|^10.0)
teamtnt/laravel-scout-tntsearch-driver v12.5.0 requires illuminate/bus (~5.4|^6.0|^7.0|^8.0|^9.0|^10.0)
teamtnt/laravel-scout-tntsearch-driver v12.5.0 requires illuminate/contracts (~5.4|^6.0|^7.0|^8.0|^9.0|^10.0)
teamtnt/laravel-scout-tntsearch-driver v12.5.0 requires illuminate/pagination (~5.4|^6.0|^7.0|^8.0|^9.0|^10.0)
teamtnt/laravel-scout-tntsearch-driver v12.5.0 requires illuminate/queue (~5.4|^6.0|^7.0|^8.0|^9.0|^10.0)
teamtnt/laravel-scout-tntsearch-driver v12.5.0 requires illuminate/support (~5.4|^6.0|^7.0|^8.0|^9.0|^10.0)
Not finding what you were looking for? Try calling `composer require "laravel/framework:11.0.0" --dry-run` to get another view on the problem.
This gives us a nice list to work with that allows us to sign off which packages we might need to look at. Equally we can try upgrading these one by one until hopefully none of them show up anymore. For instance if I try just a slightly newer version of Laravel 10, here’s what I get:
peterfox@Peters-MBP-2 project % composer why-not laravel/framework 10.43.0
There is no installed package depending on “laravel/framework” in versions not matching 10.43.0
Not finding what you were looking for? Try calling `composer require “laravel/framework:10.43.0” — dry-run` to get another view on the problem.
There are no issues so we’re ready to upgrade.
⭐ Test in a Staging Environment: It’s essential to test the upgraded packages in a staging environment before deploying the changes to production. This allows you to identify and address any compatibility issues or unexpected behavior before it impacts your users.
⭐ Utilize Composer Plugins: There are several Composer plugins available that can assist with package upgrades. For example, hirak/prestissimo
speeds up Composer installations, composer-merge-plugin
allows you to merge multiple composer.json
files, and consolidation/composer
provides additional commands and utilities for managing Composer dependencies.
By employing these tricks, you can streamline the process of upgrading Composer packages in your PHP projects while minimizing the risk of compatibility issues and downtime.
Fill out the form on the following page: https://synpass.pro/contact/ to contact us regarding your project ☝