maglnet/composer-require-checker
CLI tool that scans your PHP sources and composer.json to ensure every used class/function comes from declared dependencies. Detects “soft” transitive deps and missing required PHP extensions, helping prevent breakage after dependency updates.
Install the tool (preferred method):
wget https://github.com/maglnet/ComposerRequireChecker/releases/latest/download/composer-require-checker.phar
chmod +x composer-require-checker.phar
or globally via Composer:
composer global require maglnet/composer-require-checker
Run a basic check in your project root:
php composer-require-checker.phar check composer.json
or if globally installed:
composer-require-checker check composer.json
Review output for soft dependencies (e.g., guzzlehttp/guzzle used but not required).
Preventing "soft dependency" breakage during major updates:
composer install
composer-require-checker check
require entries to composer.json.Pre-Merge Checks
- name: Check soft dependencies
run: php composer-require-checker.phar check composer.json
Post-Update Verification
composer update, run:
composer-require-checker check --diff
Custom Config for Teams
composer-require-checker.json to:
"whitelist": ["company/*"])."ignore-files": ["tests/*"])."scan-files": ["bin/console"]).Laravel-Specific:
composer.json scripts:
"scripts": {
"post-update-cmd": [
"@php composer-require-checker check"
]
}
--diff to compare against a baseline (store results in checker-baseline.json).Monorepos:
find packages -name composer.json -exec php composer-require-checker.phar check {} \;
Custom Autoloading:
autoload-dev, add to config:
"scan-files": ["tests/**/*.php"]
False Positives with Xdebug
XDEBUG_MODE=off php composer-require-checker.phar check composer.json
php.ini for the tool’s PHP binary.Custom Installer Plugins
vendor/ files:
composer install --no-plugins
composer-require-checker check
composer install # Restore plugins
PHP Extensions
json_encode or file_get_contents:
"extensions": {
"json": true,
"fileinfo": true
}
Performance
node_modules) via:
"ignore-files": ["**/node_modules/**"]
Verbose Output:
composer-require-checker check --verbose
Dry Run:
composer-require-checker check --dry-run
(Shows what would be checked without analyzing files.)
Baseline Mode:
composer-require-checker check --baseline=checker-baseline.json
(Store results to compare future runs.)
Custom Rules
"blocked": ["symfony/debug-bundle"]
CI Integration
- name: Enforce hard dependencies
run: |
if ! php composer-require-checker.phar check --format=json | jq -e '.violations | length == 0'; then
echo "Soft dependencies found!"
exit 1
fi
IDE Support
--format=json to parse results in tools like PHPStorm for quick navigation to violations.Service Providers:
use Illuminate\Support\Facades\Cache).illuminate/support explicitly or whitelist illuminate/*.Facades:
Mail::to() may pull in illuminate/mail indirectly."require": {
"illuminate/support": "^10.0"
}
How can I help you explore Laravel packages today?