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.
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:
./composer-require-checker.phar check composer.json
or if globally installed:
composer-require-checker check composer.json
Interpret Output:
composer.json.curl, pdo_mysql) used but not declared in require or require-dev.Prevent "Soft Dependency" Breaks:
vendor dependencies, run the checker to catch unintended reliance on transitive packages (e.g., using Guzzle indirectly via laravel/http-client).spatie/laravel-activitylog updates and drops support for monolog/monolog@1.x, the checker flags your code’s use of Monolog\Logger if not explicitly required.CI/CD Integration:
Add to composer.json scripts or .github/workflows/laravel.yml:
- name: Check Dependencies
run: php composer-require-checker.phar check composer.json --
Trigger on pull_request to block soft dependencies early.
Pre-Release Check:
composer install --prefer-dist --no-dev
./composer-require-checker.phar check composer.json --format=json > checker-report.json
Use --format=json to parse results programmatically (e.g., fail builds if issues exist).
Custom Config for Laravel:
Create composer-require-checker.json to whitelist Laravel’s core symbols:
{
"config": {
"whitelist": {
"classes": ["Illuminate\\*"],
"functions": ["app\\("],
"constants": ["LARAVEL_START"]
}
}
}
Run with:
./composer-require-checker.phar check composer.json --config-file=composer-require-checker.json
--scan-files to include package-specific files (e.g., src/, tests/):
./composer-require-checker.phar check composer.json --scan-files="src/*,tests/*"
./composer-require-checker.phar check packages/package-a/composer.json
composer install --no-plugins
./composer-require-checker.phar check composer.json
composer install # Restore plugins
False Positives:
Illuminate\Support\Facades\* to avoid flags on Auth::user().true, false, or null—add these to whitelist.constants.require_once or include unless paths are static.Performance:
XDEBUG_MODE=off) to avoid timeouts or "max nesting level" errors.node_modules/ or vendor/ from scans (use scan-files to limit scope).Custom Installers:
post-install-cmd or custom installers, run composer install --no-plugins first to ensure files land in vendor/.PHP Extensions:
curl_init()). If you rely on ext-curl but it’s not in require, add:
"config": {
"extensions": ["curl"]
}
--verbose to see parsed files and symbols:
./composer-require-checker.phar check composer.json --verbose
composer.json:
./composer-require-checker.phar check composer.json --dry-run
./composer-require-checker.phar check composer.json --format=json | jq '.violations[] | .file, .symbol'
Custom Rules:
Extend the tool by forking and modifying src/ComposerRequireChecker/Checker/Checker.php to add project-specific logic (e.g., allow DB::* but not PDO::*).
CI Integration: Fail builds on warnings (not just errors) by piping output to a script:
- name: Enforce Hard Dependencies
run: |
./composer-require-checker.phar check composer.json --format=json | jq '.violations | length' > /dev/null
if [ $(jq '.violations | length' checker-report.json) -gt 0 ]; then
exit 1
fi
Whitelist Management:
Use a shared config file (e.g., config/composer-require-checker.json) for team-wide rules, versioned in Git.
App\Providers\* if not whitelisted. Add to whitelist.classes:
"classes": ["App\\Providers\\*"]
bin/console in scan-files if using CLI-specific logic:
"scan-files": ["bin/console"]
composer.json autoload includes all entry points (e.g., src/, config/). Example:
"autoload": {
"psr-4": {
"Acme\\": "src/"
},
"files": ["config/acme.php"]
}
How can I help you explore Laravel packages today?