dealerdirect/phpcodesniffer-composer-installer
Composer installer plugin that automatically discovers and installs PHP_CodeSniffer coding standards (rulesets) from Composer packages. It configures PHPCS installed_paths for you, avoiding manual symlinks and configuration. Supports PHPCS 3/4 and Composer 2.2+.
Install the Plugin Add the package as a dev dependency:
composer require --dev dealerdirect/phpcodesniffer-composer-installer
Grant plugin execution permission (Composer 2.2+):
composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true
(This auto-configures composer.json with the allow-plugins setting.)
Add PHPCS Standards
Require any phpcodesniffer-standard packages (e.g., phpcompatibility/php-compatibility):
composer require --dev phpcompatibility/php-compatibility
Verify Installation
Run composer install or composer update. Afterward, check installed standards:
./vendor/bin/phpcs -i
Automate PHPCS Standard Setup
Replace manual installed_paths configuration in .phpcs.xml by letting Composer auto-detect and register standards from dependencies. Example:
composer require --dev dealerdirect/phpcodesniffer-composer-installer squizlabs/php_codesniffer
Now phpcs will automatically include Squiz standards without manual path setup.
Dependency Management
type: phpcodesniffer-standard (e.g., wpcs/wpcs).composer install/update.Integration with CI/CD
composer.json scripts for CI environments:
{
"scripts": {
"post-install-cmd": ["PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run"]
}
}
Custom Standard Development
type: phpcodesniffer-standard.composer.json:
{
"name": "vendor/custom-standards",
"type": "phpcodesniffer-standard",
"require": {
"squizlabs/php_codesniffer": "^4.0"
}
}
Search Depth Customization
composer.json:
{
"extra": {
"phpcodesniffer-search-depth": 5
}
}
Laravel Mix/Pest Integration Add PHPCS to Laravel’s dev workflow:
composer require --dev dealerdirect/phpcodesniffer-composer-installer pestphp/pest-plugin-phpunit
Configure Pest to run PHPCS:
// phpunit.xml
<phpunit>
<extensions>
<extension class="Pest\PHPUnit\Extensions\PHPCSExtension"/>
</extensions>
</phpunit>
Artisan Command Hooks
Trigger PHPCS in Laravel’s post-update-cmd:
{
"scripts": {
"post-update-cmd": [
"@php artisan optimize:clear",
"PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run"
]
}
}
Laravel Forge/Envoyer
Ensure standards are installed on deployment by adding the plugin to composer.json in your repo.
Composer 2.2+ Plugin Permission
allow-plugins) causes silent failures.composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true or add it manually to composer.json.Global vs. Local Plugin Conflict
composer self-update to ensure local project plugins take precedence.Open-Basedir Restrictions
open_basedir, breaking PHPCS path resolution.composer.json to include:
{
"config": {
"open_basedir": ["vendor/", "path/to/project"]
}
}
Circular Dependencies
* or ^0.4 || ^1.0).PHPCS Version Mismatches
composer.json:
{
"require-dev": {
"squizlabs/php_codesniffer": "^4.0"
}
}
Verify Plugin Execution Check Composer logs for plugin output:
composer install --verbose
Look for lines like:
[PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin] Installing standards...
Manual Plugin Invocation Test plugin functionality independently:
composer run-script install-codestandards
Check Installed Standards List all detected standards:
./vendor/bin/phpcs -i
If empty, the plugin failed to register paths. Recheck composer.json for allow-plugins.
Custom Standard Discovery
Override the plugin’s standard discovery logic by extending the Plugin class:
// src/Composer/Plugin.php
namespace App\Composer;
use PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin as BasePlugin;
class Plugin extends BasePlugin {
protected function getStandardPaths(): array {
return array_merge(
parent::getStandardPaths(),
['/custom/path/to/standards']
);
}
}
Register the custom plugin in composer.json:
{
"scripts": {
"post-install-cmd": ["App\\Composer\\Plugin::run"]
}
}
Post-Install Hooks Extend PHPCS configuration after plugin execution:
{
"scripts": {
"post-install-cmd": [
"PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run",
"@custom-phpcs-config"
]
},
"scripts-custom": {
"custom-phpcs-config": "php artisan phpcs:configure"
}
}
CI-Specific Optimizations Skip plugin execution in CI if standards are already cached:
{
"scripts": {
"post-install-cmd": [
"@php -r \"if (!getenv('CI')) { PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run(); }\""
]
}
}
Leverage composer.json Config
Centralize PHPCS settings in composer.json:
{
"config": {
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
}
},
"extra": {
"phpcodesniffer-search-depth": 4,
"phpcodesniffer-standard-names": ["PSR12", "Custom"]
}
}
Combine with php-cs-fixer
Use the plugin alongside php-cs-fixer for auto-fixing:
composer require --dev dealerdirect/phpcodesniffer-composer-installer friendsofphp/php-cs-fixer
Add to composer.json:
{
"scripts": {
"post-install-cmd": [
"PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin::run",
"php-cs-fixer fix --rules=@PSR12 --dry-run"
]
}
}
Document Standard Usage
Add a README.md section to your project:
## PHPCS Standards
This project uses the following standards, auto-installed via Composer:
```bash
./vendor/bin/phpcs -i
How can I help you explore Laravel packages today?