spryker/code-sniffer
Spryker Code Sniffer is a PHP_CodeSniffer ruleset for Spryker projects. Enforces Spryker coding standards and best practices, supports automated code style checks in CI, and helps keep code consistent across teams and modules.
Installation:
composer require --dev spryker/code-sniffer
Add to require-dev in composer.json for project-wide use.
First Run:
vendor/bin/phpcs --standard=vendor/spryker/code-sniffer/Spryker/ruleset.xml ./src
Or use the Spryker CLI shortcut:
console code:sniff:style
Fix Issues Automatically:
console code:sniff:style -f
Spryker/ruleset.xml – Default configuration for all sniffs.SprykerStrict/ruleset.xml – Stricter variant for advanced projects.Run the sniffer on a single module to validate adherence to Spryker conventions:
console code:sniff:style -m Customer -v
This checks only the src/ directory of the Customer module.
Pre-Commit Hook:
Integrate phpcs into your Git hooks to catch violations early:
echo 'vendor/bin/phpcs --standard=vendor/spryker/code-sniffer/Spryker/ruleset.xml ./src' >> .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
IDE Integration: Configure PHPStorm (as per README) or VSCode with:
phpcbf to a keyboard shortcut (e.g., Ctrl+Alt+F).CI Pipeline: Add to your CI (e.g., GitHub Actions, CircleCI):
- name: Run Code Sniffer
run: vendor/bin/console code:sniff:style
Exclude Paths:
Ignore generated/third-party code in ruleset.xml:
<exclude-pattern>*/src/Generated/*</exclude-pattern>
<exclude-pattern>*/vendor/*</exclude-pattern>
Custom Rulesets:
Extend the default ruleset.xml for project-specific needs:
<rule ref="vendor/spryker/code-sniffer/Spryker/ruleset.xml">
<exclude name="SlevomatCodingStandard.Functions.DisallowNamedArguments"/>
</rule>
Strict Mode:
Enable stricter checks by switching to SprykerStrict:
console code:sniff:style --standard=vendor/spryker/code-sniffer/SprykerStrict/ruleset.xml
Target a specific module or path:
console code:sniff:style -m Oms -p OrderManagement
Checks only src/Oms/OrderManagement/.
False Positives in Generated Code:
src/Generated/) often violate rules. Exclude them in ruleset.xml:
<exclude-pattern>*/src/Generated/*</exclude-pattern>
PHP Version Mismatches:
SprykerDisallowFunctions) block PHP 8+ features in PHP 7.4 code.ruleset.xml:
<rule ref="Spryker.Internal.SprykerDisallowFunctions">
<properties>
<property name="phpVersion" value="8.2"/>
</properties>
</rule>
Namespace Conflicts:
Pyz, Spryker, etc.).<rule ref="Spryker.Namespaces.SprykerNamespace">
<properties>
<property name="namespace" value="App"/>
<property name="isRoot" value="true"/>
</properties>
</rule>
Performance on Large Codebases:
phpcs on the entire src/ directory can be slow.--parallel (PHP_CodeSniffer ≥ 3.7.0):
vendor/bin/phpcs --parallel=8 --standard=Spryker ./src
Verbose Output:
Use -v to debug specific errors:
console code:sniff:style -v
Isolate Sniffs: Run a single sniff to diagnose issues:
console code:sniff:style -s Spryker.Namespaces.SprykerNamespace
Token Inspection: Use the built-in tokenizer to debug custom sniffs:
bin/tokenize path/to/file.php
Custom Sniffs:
Add new sniffs to Sniffs/ and test them:
php tests/generate.php MyNamespace.MySniff
composer test
Override Default Rules:
Create a project-specific ruleset.xml and reference it in DevelopmentConfig.php:
public function getCodingStandard() {
return __DIR__ . '/../config/ruleset.xml';
}
Silence Rules Temporarily: Disable a rule during migration:
<rule ref="SlevomatCodingStandard.ControlStructures.ControlStructureSpacing">
<severity>0</severity>
</rule>
Auto-Fix Common Issues:
Use phpcbf for fixable errors (e.g., indentation, braces):
console code:sniff:style -f
Strict Types Enforcement:
Enforce declare(strict_types=1) in ruleset.xml:
<rule ref="Spryker.PHP.DeclareStrictTypesAfterFileDoc">
<properties>
<property name="strictTypesMandatory" value="true"/>
</properties>
</rule>
License Header Check:
Validate license headers via .license file (PHP docblock format).
CI-Safe Updates:
Update the sniffer in a dedicated branch (e.g., master-cs) before merging to avoid breaking builds:
composer require spryker/code-sniffer:~1.0.0 --dev
How can I help you explore Laravel packages today?