Used by Shopsys, Nette and Sylius.
- Use PHP_CodeSniffer || PHP-CS-Fixer - anything you like
- 2nd run under few seconds with caching
- Skipping files for specific checkers
- Prepared checker sets - PSR2, Symfony, Common, Symplify and more...
composer require --dev symplify/easy-coding-standard
Create an easy-coding-standard.yml
in your root directory and add Sniffs or Fixers you'd love to use.
Let's start with the most common one - array()
=> []
:
services:
PhpCsFixer\Fixer\ArrayNotation\ArraySyntaxFixer:
syntax: short
# dry
vendor/bin/ecs check src
# fix
vendor/bin/ecs check src --fix
Tip: Do you want autocomplete too?
There are prepared sets in /config
directory that you can use:
You pick config in CLI with --config
:
vendor/bin/ecs check src --config vendor/symplify/easy-coding-standard/config/clean-code.yml
Too long? Try --level
shortcut:
vendor/bin/ecs check src --level clean-code
or include more of them in config:
# easy-coding-standard.yml
imports:
- { resource: 'vendor/symplify/easy-coding-standard/config/clean-code.yml' }
- { resource: 'vendor/symplify/easy-coding-standard/config/psr2.yml' }
What if you add symfony.yml
set, but don't like PhpCsFixer\Fixer\PhpTag\BlankLineAfterOpeningTagFixer
?
imports:
- { resource: 'vendor/symplify/easy-coding-standard/config/symfony.yml' }
parameters:
exclude_checkers:
- 'PhpCsFixer\Fixer\PhpTag\BlankLineAfterOpeningTagFixer'
Sometimes, checker finds an error in code that inherits from code you can't change.
No worries! Just skip checker for this file:
parameters:
skip:
SlevomatCodingStandard\Sniffs\TypeHints\TypeHintDeclarationSniff:
# relative path to file (you can copy this from error report)
- 'packages/EasyCodingStandard/packages/SniffRunner/src/File/File.php'
# or multiple files by path to match against "fnmatch()"
- '*packages/CodingStandard/src/Sniffs/*/*Sniff.php'
You can also skip specific codes that you know from PHP_CodeSniffer:
parameters:
skip:
# code to skip for all files
SlevomatCodingStandard\Sniffs\TypeHints\TypeHintDeclarationSniff.UselessDocComment: ~
# code to skip for specific files/patterns
SlevomatCodingStandard\Sniffs\TypeHints\TypeHintDeclarationSniff.MissingTraversableParameterTypeHintSpecification:
- '*src/Form/Type/*Type.php'
Or just 2 files?
parameters:
exclude_files:
# generated files
- 'lib/PhpParser/Parser/Php5.php'
- 'lib/PhpParser/Parser/Php7.php'
# or with fnmatch() pattern
- '*/lib/PhpParser/Parser/Php*.php'
Normally you want to exclude these files, because they're not common code - they're just test files or dummy fixtures. In case you want to check them as well, you can.
Let's say you want to include *.phpt
files.
-
Create a class in
src/Finder/PhpAndPhptFilesProvider.php
-
Implement
Symplify\EasyCodingStandard\Contract\Finder\CustomSourceProviderInterface
-
Register it as services to
easy-coding-standard.yml
like any other Symfony service:services: App\Finder\PhpAndPhptFilesProvider: ~
The PhpAndPhptFilesProvider
might look like this:
namespace App\Finder;
use IteratorAggregate;
use Nette\Utils\Finder;
use SplFileInfo;
use Symplify\EasyCodingStandard\Contract\Finder\CustomSourceProviderInterface;
final class PhpAndPhptFilesProvider implements CustomSourceProviderInterface
{
/**
* @param string[] $source
*/
public function find(array $source): IteratorAggregate
{
# $source is "source" argument passed in CLI
# inc CLI: "vendor/bin/ecs check /src" => here: ['/src']
return Finder::find('*.php', '*.phpt')->in($source);
}
}
Don't forget to autoload it with composer.
Use any Finder you like: Nette\Finder or Symfony\Finder.
How to show all loaded checkers?
vendor/bin/ecs show
vendor/bin/ecs show --config ...
How to clear cache?
vendor/bin/ecs check src --clear-cache
How about changing cache directory?
parameters:
cache_directory: .ecs_cache # defaults to sys_get_temp_dir() . '/_easy_coding_standard/_changed_files_detector_tests'
Can I use tabs?
parameters:
indentation: tab # "spaces" by default
How do I find the slowest checkers?
vendor/bin/ecs check src --show-performance --clear-cache
Send issue or pull-request to main repository.