maglnet/composer-require-checker
CLI tool that scans your PHP sources and composer.json to ensure every used class/function/extension comes from an explicit require. Detects “soft” (transitive) dependencies and missing PHP extensions so updates don’t break your package.
Installation:
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
First Run: Navigate to your Laravel project root and execute:
php composer-require-checker.phar check composer.json
This scans your project for soft dependencies (unlisted use statements, function calls, or extension usage).
Quick Fix:
If a dependency like guzzlehttp/guzzle is flagged, add it to composer.json under require:
"require": {
"guzzlehttp/guzzle": "^7.0"
}
Then run composer update.
Preventing Breaking Changes: Before merging a PR or deploying, run the checker to ensure no soft dependencies exist. Example:
./composer-require-checker check --config-file=composer-require-checker.json composer.json
This catches issues like:
Symfony\Component\Debug\Debug without requiring symfony/debug.json_decode() without listing ext-json in require.CI Integration:
Add to .github/workflows/laravel.yml:
- name: Check Dependencies
run: php composer-require-checker.phar check composer.json
Fail the build if soft dependencies are found.
Local Development:
Alias the command in ~/.bashrc:
alias crc="php composer-require-checker.phar check"
Run before feature branches:
crc composer.json
Custom Config:
Create composer-require-checker.json to whitelist known safe dependencies:
{
"config": {
"whitelist": {
"packages": ["monolog/monolog": "2.0"],
"extensions": ["pdo_mysql"]
}
}
}
Service Providers:
Scan app/Providers/ for soft dependencies in boot methods:
php composer-require-checker.phar check --config-file=composer-require-checker.json composer.json
Example fix: Add vlucas/phpdotenv to composer.json if using Dotenv::load().
Artisan Commands:
Check app/Console/Commands/ for soft dependencies in handle methods:
php composer-require-checker.phar check --config-file=composer-require-checker.json composer.json --scan-files="app/Console/Commands/*.php"
Packages:
For custom packages, use --directory to scan vendor packages:
php composer-require-checker.phar check --directory=./vendor/your-package composer.json
False Positives:
"whitelist": {
"packages": ["symfony/*": "*"]
}
count(), array_map(), etc. by extending the default config.Xdebug Slowdowns: Disable Xdebug for faster scans:
XDEBUG_MODE=off php composer-require-checker.phar check composer.json
Custom Installers:
If using post-install-cmd or plugins, run:
composer install --no-plugins
php composer-require-checker.phar check composer.json
composer install
PSR-4 Autoloading:
Ensure autoload-dev is included if scanning test files:
"scan-files": ["tests/**/*.php"]
--verbose to see scanned files:
php composer-require-checker.phar check --verbose composer.json
composer.json:
php composer-require-checker.phar check --config-file=test-config.json composer.json
Custom Rules: Extend the config to ignore specific classes/methods:
"config": {
"ignore": {
"files": ["app/Helpers/legacy.php"],
"classes": ["App\\Helpers\\LegacyHelper::oldMethod"]
}
}
Git Hooks:
Add to .git/hooks/pre-commit:
#!/bin/sh
php composer-require-checker.phar check composer.json || exit 1
IDE Integration:
Use the checker’s output to annotate unused imports in PHPStorm/VSCode via plugins like PHP Intelephense.
// Soft dependency (flagged)
Cache::remember(...);
// Hard dependency (fixed)
require "symfony/cache": "^6.0";
register()/boot() methods of providers. Example:
// Soft dependency (flagged)
$this->app->bind('cache', function () {
return new \Illuminate\Cache\CacheManager(); // Requires symfony/cache
});
How can I help you explore Laravel packages today?