php-forge / coding-standard
Centralized ECS and Rector configurations for PHP projects.
Requires
- php: >=8.3
- rector/rector: ^2.1
- symplify/easy-coding-standard: ^13.0
Requires (Dev)
- php-forge/baseline: ^0.1
- yii2-extensions/scaffold: ^0.1
This package is auto-updated.
Last update: 2026-05-06 14:19:35 UTC
README
Coding standard
Centralized ECS and Rector configuration for PHP projects
Share one set of rules across multiple repositories via Composer.
System requirements
Installation
composer require php-forge/coding-standard:^0.3 --dev
Or add the dependency manually to composer.json:
{
"require-dev": {
"php-forge/coding-standard": "^0.3"
}
}
Then run composer update.
Configuration files
This package ships shared ECS and Rector configurations under vendor/php-forge/coding-standard/src/:
| File | Purpose |
|---|---|
src/ecs.php |
Shared ECS base rules, no PHP migration set |
src/ecs-81.php |
Base + @PHP81Migration PHP-CS-Fixer set |
src/ecs-82.php |
Base + @PHP82Migration |
src/ecs-83.php |
Base + @PHP83Migration |
src/ecs-84.php |
Base + @PHP84Migration |
src/rector.php |
Shared Rector base rules, no PHP level set |
src/rector-81.php |
Base + SetList::PHP_81 + LevelSetList::UP_TO_PHP_81 |
src/rector-82.php |
Base + SetList::PHP_82 + LevelSetList::UP_TO_PHP_82 |
src/rector-83.php |
Base + SetList::PHP_83 + LevelSetList::UP_TO_PHP_83 |
src/rector-84.php |
Base + SetList::PHP_84 + LevelSetList::UP_TO_PHP_84 |
Pick the version that matches the minimum PHP your project supports; Rector upgrades code up to that level and
PHP-CS-Fixer enforces matching syntax. The plain ecs.php / rector.php apply no PHP-version migrations.
ECS wrapper (ecs.php)
Create ecs.php in your repository root, requiring the version that matches the minimum PHP your project supports
(ecs-83.php for PHP 8.3, etc.):
<?php declare(strict_types=1); /** @var \Symplify\EasyCodingStandard\Configuration\ECSConfigBuilder $ecsConfigBuilder */ $ecsConfigBuilder = require __DIR__ . '/vendor/php-forge/coding-standard/src/ecs-83.php'; return $ecsConfigBuilder ->withPaths( [ __DIR__ . '/src', __DIR__ . '/tests', ], ) ->withSkip( [ // project-specific skips here. ], );
Rector wrapper (rector.php)
Create rector.php in your repository root, importing the version that matches your minimum PHP target:
<?php declare(strict_types=1); use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { $rectorConfig->import(__DIR__ . '/vendor/php-forge/coding-standard/src/rector-83.php'); $rectorConfig->paths( [ __DIR__ . '/src', __DIR__ . '/tests', ], ); // project-specific overrides can be added after the import. // $rectorConfig->skip([...]); };
Yii2-specific rules
For framework-specific rules, keep them in a separate config file (or a separate package) and import it after the base configuration. Do not mix Yii2 rules into the generic base:
<?php declare(strict_types=1); use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { $rectorConfig->import(__DIR__ . '/vendor/php-forge/coding-standard/src/rector.php'); $rectorConfig->import(__DIR__ . '/rector-yii2.php'); $rectorConfig->paths( [ __DIR__ . '/src', __DIR__ . '/tests', ], ); };
Scaffolded distribution
This package is a yii2-extensions/scaffold provider for the
root ecs.php and rector.php wrapper templates (sourced from src/config/ via scaffold.json). Consumers can
opt in by allowing the plugin and listing this package as an authorised provider:
composer require yii2-extensions/scaffold:^0.1 --dev
{
"config": {
"allow-plugins": {
"yii2-extensions/scaffold": true
}
},
"extra": {
"scaffold": {
"auto": false,
"allowed-packages": [
"php-forge/coding-standard"
]
}
}
}
With auto: false, the plugin does not run on composer install; sync the wrappers manually:
vendor/bin/scaffold reapply --provider=php-forge/coding-standard
Both wrappers ship in mode preserve; written once on first install, never overwritten so consumer edits to paths or
PHP target version survive subsequent runs.
Related packages
For dev environment scaffolding, see php-forge/baseline. The two packages are
independent; adopt either, both, or neither.
Composer scripts
Follow the same convention used across PHP Forge repositories:
{
"scripts": {
"ecs": "./vendor/bin/ecs --fix",
"rector": "./vendor/bin/rector process"
}
}