Installation:
composer require --dev slevomat/coding-standard
Add to your project's phpcs.xml (or create one):
<config defaultStandard="SlevomatCodingStandard">
<arg name="standard" value="SlevomatCodingStandard"/>
</config>
First Run:
vendor/bin/phpcs --standard=SlevomatCodingStandard app/
Run the coding standard on your Laravel project's core files (e.g., app/ directory) to catch:
null safe operator bans).Use --diff flag for pre-commit hooks:
vendor/bin/phpcs --standard=SlevomatCodingStandard --diff app/
Pre-Commit Hooks:
Use phpcs in a Git hook to enforce standards before commits:
vendor/bin/phpcs --standard=SlevomatCodingStandard --warning-severity=3 --errors-on-incomplete=1 app/
Exit with non-zero on errors to block commits.
CI/CD Pipeline: Add to Laravel's CI (e.g., GitHub Actions):
- name: Run Slevomat Coding Standard
run: vendor/bin/phpcs --standard=SlevomatCodingStandard --warning-severity=3 --errors-on-incomplete=1 app/
Auto-Fix: Enable auto-fixing for supported sniffs (marked with 🔧 in the list):
vendor/bin/phpcbf --standard=SlevomatCodingStandard --diff app/
SlevomatCodingStandard.Classes.ClassLength to enforce reasonable class sizes for Laravel services (e.g., < 200 lines).SlevomatCodingStandard.ControlStructures.EarlyExit to Laravel controllers for cleaner error handling.SlevomatCodingStandard.Arrays.AlphabeticallySortedByKeys for up()/down() method arrays in migrations.Extend the standard in phpcs.xml:
<rule ref="SlevomatCodingStandard">
<exclude name="SlevomatCodingStandard.Arrays.DisallowPartiallyKeyed"/>
<exclude name="SlevomatCodingStandard.Classes.ClassLength"/>
<arg name="severity" value="5"/>
</rule>
Performance:
phpcs. Exclude vendor directories:
<file>./app</file>
<file>./config</file>
<exclude-pattern>./vendor/</exclude-pattern>
--cache flag for repeated runs.False Positives:
SlevomatCodingStandard.Attributes.DisallowMultipleAttributesPerLine) may conflict with Laravel's attribute usage (e.g., #[Route]). Suppress locally:
// phpcs:ignore SlevomatCodingStandard.Attributes.DisallowMultipleAttributesPerLine
#[Route('/test'), Name('test')]
SlevomatCodingStandard.Classes.ForbiddenPublicProperty may flag Laravel's magic properties (e.g., $app). Exclude them in phpcs.xml:
<exclude name="SlevomatCodingStandard.Classes.ForbiddenPublicProperty">
<property>app</property>
</exclude>
Auto-Fix Limitations:
SlevomatCodingStandard.Classes.ClassLength). Test phpcbf in a branch first:
git checkout -b fix-coding-standard
vendor/bin/phpcbf --standard=SlevomatCodingStandard app/
git diff
--verbose to debug sniff failures:
vendor/bin/phpcs --standard=SlevomatCodingStandard --verbose app/Models/User.php
SlevomatCodingStandard.ControlStructures.DisallowNullSafeObjectOperator vs. Laravel 8.50+ features).phpcs.xml file:
<rule ref="SlevomatCodingStandard">
<include name="YourVendor\YourCustomSniff"/>
</rule>
vendor/bin/phpstan analyse --level=7
vendor/bin/phpcs --standard=SlevomatCodingStandard app/
phpcs check to your composer.json scripts:
"scripts": {
"cs-check": "phpcs --standard=SlevomatCodingStandard --warning-severity=3 app/"
}
Run with:
composer cs-check
How can I help you explore Laravel packages today?