php-collective/code-sniffer
PHP CodeSniffer rulesets from PhpCollective: PSR-2 compliant with many extra sniffs/fixers (incl. PSR-12) plus a stricter PhpCollectiveStrict standard. Install via Composer, configure phpcs.xml, run phpcs/phpcbf to check and auto-fix code style.
Installation:
composer require --dev php-collective/code-sniffer
Add to composer.json under require-dev:
"php-collective/code-sniffer": "^1.0"
Configure phpcs.xml:
Place this in your project root:
<?xml version="1.0"?>
<ruleset name="ProjectName">
<file>src/</file>
<file>tests/</file>
<rule ref="vendor/php-collective/code-sniffer/PhpCollective/ruleset.xml"/>
</ruleset>
First Run:
vendor/bin/phpcs
Or via Composer script (add to composer.json):
"scripts": {
"cs-check": "phpcs -nps"
}
Run with:
composer cs-check
composer cs-check to identify violations.composer cs-fix # Uses `phpcbf`
name: PHP Code Sniffer
on: [push, pull_request]
jobs:
phpcs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: composer install
- run: composer cs-check
pre-commit hooks to run phpcs on staged files:
composer require --dev laravel-pint/pre-commit
Configure in .php-cs-fixer.dist.php or .phpcs.xml.phpcs.xml to disable/enable sniffs:
<rule ref="vendor/php-collective/code-sniffer/PhpCollective/ruleset.xml">
<exclude name="PhpCollective.WhiteSpace.EmptyLines"/>
<config name="PhpCollective.Arrays.DisallowLongArraySyntax" value="true"/>
</rule>
app/Sniffs/YourSniff.php) and reference it:
<rule ref="app/Sniffs/YourSniff"/>
phpcs/phpcbf (as per README).<rule ref="PhpCollective.WhiteSpace"/>
<rule ref="PhpCollective.Formatting"/>
Ctrl+Alt+S for sniffing).PhpCollectiveStrict:
Replace the rule reference in phpcs.xml:
<rule ref="vendor/php-collective/code-sniffer/PhpCollectiveStrict/ruleset.xml"/>
PhpCollective in development.PhpCollectiveStrict in CI to catch regressions early.CONTRIBUTING.md snippet:
## Code Style
Run `composer cs-check` before submitting PRs.
Use `composer cs-fix` to auto-correct where possible.
phpcs during code reviews to highlight violations in real-time.False Positives:
PhpCollective.Arrays.DisallowLongArraySyntax may flag legacy code.phpcs.xml:
<exclude-pattern>*/legacy/*</exclude-pattern>
Performance:
phpcs.--parallel (PHP_CodeSniffer ≥ 3.7):
vendor/bin/phpcs --parallel=4
phpcs --cache.IDE Conflicts:
phpcbf modifies files.composer cs-fix.Strict Mode Breaking Changes:
PhpCollectiveStrict enforces strict type hints (e.g., PhpCollectiveStrict.TypeHints.PropertyTypeHint).--report=summary to track progress:
vendor/bin/phpcs --standard=PhpCollectiveStrict --report=summary
Verbose Output:
Run with -v to debug rule application:
vendor/bin/phpcs -v src/YourFile.php
Isolate Sniffs: Test individual sniffs:
vendor/bin/phpcs --standard=PhpCollective.Arrays src/
Custom Error Reporting: Generate a JSON report for CI:
vendor/bin/phpcs --report=json > phpcs-report.json
Custom Sniffs:
PHP_CodeSniffer\Standards\AbstractStandard to add project-specific rules.Request class naming).Dynamic Rules:
Use PHP_CodeSniffer\Config to load rules dynamically:
$config = new PHP_CodeSniffer\Config();
$config->addConfigData([
'installed_paths' => [__DIR__.'/vendor/php-collective/code-sniffer'],
'default_standard' => 'PhpCollective',
]);
Integration with PHPStan:
Combine with phpstan/extension-installer to enforce both static analysis and style:
composer require --dev phpstan/phpstan
composer require --dev phpstan/extension-installer
Partial Fixes:
Use phpcbf selectively:
vendor/bin/phpcbf --rules=PhpCollective.Formatting src/
Pre-commit Hooks:
Leverage pre-commit to block style violations:
composer require --dev php-cs-fixer
composer require --dev laravel-pint/pre-commit
Configure in .php-cs-fixer.dist.php to match phpcs.xml rules.
Visual Studio Code:
Use the PHP Intelephense extension with phpcs integration:
// .vscode/settings.json
{
"intelephense.codeSnifferEnabled": true,
"intelephense.codeSnifferStandard": "PhpCollective"
}
Legacy Code:
For large refactors, use --ignore to bypass critical sniffs temporarily:
vendor/bin/phpcs --ignore=PhpCollective.Arrays.DisallowLongArraySyntax
How can I help you explore Laravel packages today?