Installation Add the package via Composer:
composer require --dev slevomat/coding-standard
Require PHP_CodeSniffer (if not already installed):
composer require --dev squizlabs/php_codesniffer
First Run Execute the default Slevomat ruleset against your Laravel project:
vendor/bin/phpcs --standard=vendor/slevomat/coding-standard --extensions=php app/
Quick Fixes Auto-fix supported violations (marked with 🔧 in the docs):
vendor/bin/phpcbf --standard=vendor/slevomat/coding-standard --extensions=php app/
Integrate with Laravel Forge or Git hooks to enforce standards before commits:
# Example in a pre-commit hook (bash)
#!/bin/sh
vendor/bin/phpcs --standard=vendor/slevomat/coding-standard --extensions=php app/ || exit 1
CI/CD Pipeline
Add to Laravel’s GitHub Actions (.github/workflows/php.yml):
- name: Run Slevomat Coding Standard
run: vendor/bin/phpcs --standard=vendor/slevomat/coding-standard --extensions=php app/ --report=checkstyle | tee phpcs.xml
IDE Integration Configure PHPStorm to use the Slevomat ruleset:
vendor/slevomat/coding-standardCustom Ruleset
Extend the default ruleset in phpcs.xml:
<config name="standard" value="vendor/slevomat/coding-standard"/>
<config name="encoding" value="utf-8"/>
<config name="tab-width" value="4"/>
<rule ref="SlevomatCodingStandard.Arrays.TrailingArrayComma"/>
<rule ref="SlevomatCodingStandard.Classes.ClassLength" severity="warning" limit="300"/>
Laravel-Specific Patterns
SlevomatCodingStandard.Classes.ClassKeywordOrder to group use statements, properties, methods, etc.SlevomatCodingStandard.Classes.ForbiddenPublicProperty to block public properties in controllers.SlevomatCodingStandard.Arrays.AlphabeticallySortedByKeys to migration arrays (e.g., $table->string('column');).Team Onboarding
CONTRIBUTING.md:
## Code Style
Run `composer cs-check` to validate your changes against Slevomat’s standards.
composer.json:
"scripts": {
"cs-check": "phpcs --standard=vendor/slevomat/coding-standard --extensions=php app/",
"cs-fix": "phpcbf --standard=vendor/slevomat/coding-standard --extensions=php app/"
}
Performance Overhead
vendor/bin/phpcs --standard=vendor/slevomat/coding-standard --ignore=tests,storage app/
Overly Strict Rules
SlevomatCodingStandard.Classes.ClassLength may flag legacy code.<rule ref="SlevomatCodingStandard.Classes.ClassLength">
<severity>warning</severity>
<properties>
<property name="limit" value="500" />
</properties>
</rule>
Auto-Fix Limitations
--fix (e.g., SlevomatCodingStandard.Classes.ForbiddenPublicProperty).Conflicts with Other Tools
Attribute Sniffs in Older PHP
SlevomatCodingStandard.Attributes.*) may fail on PHP < 8.0.Verbose Output
Run with -v to debug sniff application:
vendor/bin/phpcs -v --standard=vendor/slevomat/coding-standard app/Http/Controllers/
Isolate Violations Test individual sniffs:
vendor/bin/phpcs --standard=vendor/slevomat/coding-standard --ruleset=SlevomatCodingStandard.Arrays app/
Local Suppression Suppress a sniff for a specific line:
// phpcs:disable SlevomatCodingStandard.Arrays.TrailingArrayComma
$array = [
'key' => 'value', // No trailing comma
];
// phpcs:enable
Custom Error Messages
Override default messages in phpcs.xml:
<rule ref="SlevomatCodingStandard.Classes.ClassLength">
<error>Class exceeds 300 lines; consider splitting.</error>
</rule>
Create Custom Sniffs
Extend the package by writing your own sniffs (see PHP_CodeSniffer docs).
Example: Enforce Laravel-specific naming conventions (e.g., *Service suffix for services).
Combine Rulesets
Merge with other standards (e.g., PSR-12) in phpcs.xml:
<config name="standard" value="PSR12, vendor/slevomat/coding-standard"/>
Dynamic Rules via PHP
Use phpcs.xml to load dynamic rules:
<rule ref="SlevomatCodingStandard.Classes.ClassLength">
<properties>
<property name="limit" value="$(class_limit)" />
</properties>
</rule>
Pass class_limit via CLI or environment variables.
GitHub Action Customization Add annotations to PRs with detailed feedback:
- name: Annotate PR
uses: ataylorme/phpcs-action@v1
with:
phpcs-args: "--standard=vendor/slevomat/coding-standard --report=github"
Laravel Artisan Command Create a custom Artisan command for quick checks:
// app/Console/Commands/CheckCodeStandard.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Symfony\Component\Process\Process;
class CheckCodeStandard extends Command
{
protected $signature = 'code:standard';
protected $description = 'Run Slevomat Coding Standard checks';
public function handle()
{
$process = new Process(['phpcs', '--standard=vendor/slevomat/coding-standard', 'app/']);
$process->run();
$this->output->write($process->getOutput());
if ($process->getExitCode() !== 0) exit(1);
}
}
How can I help you explore Laravel packages today?