Centralized ECS and Rector configuration for PHP projects
Share one set of rules across multiple repositories via Composer.
composer require php-forge/coding-standard:^0.1 --devThis package provides shared configuration files under vendor/php-forge/coding-standard/config/:
config/ecs.php(shared ECS rules, no paths)config/rector.php(shared Rector rules, no paths)
Consumer repositories should create wrapper config files at the repository root. Wrappers define the paths for that repository and import the shared configuration.
Create ecs.php in your repository root:
<?php
declare(strict_types=1);
/** @var \Symplify\EasyCodingStandard\Configuration\ECSConfigBuilder $ecsConfigBuilder */
$ecsConfigBuilder = require __DIR__ . '/vendor/php-forge/coding-standard/config/ecs.php';
return $ecsConfigBuilder->withPaths(
[
__DIR__ . '/src',
__DIR__ . '/tests',
],
);To override or skip rules locally, apply changes after requiring the shared config:
<?php
declare(strict_types=1);
/** @var \Symplify\EasyCodingStandard\Configuration\ECSConfigBuilder $ecsConfigBuilder */
$ecsConfigBuilder = require __DIR__ . '/vendor/php-forge/coding-standard/config/ecs.php';
return $ecsConfigBuilder
->withPaths(
[
__DIR__ . '/src',
__DIR__ . '/tests',
],
)
->withSkip(
[
// add project-specific skips here.
],
);Create rector.php in your repository root:
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->import(__DIR__ . '/vendor/php-forge/coding-standard/config/rector.php');
$rectorConfig->paths(
[
__DIR__ . '/src',
__DIR__ . '/tests',
],
);
// project-specific overrides can be added after the import.
// $rectorConfig->skip([...]);
};If you need framework-specific rules (Yii2), keep them in a separate config file (or a separate package) and import it after the base configuration. Do not mix Yii2-specific rules into the generic base.
Example (Rector):
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->import(__DIR__ . '/vendor/php-forge/coding-standard/config/rector.php');
$rectorConfig->import(__DIR__ . '/rector-yii2.php');
$rectorConfig->paths(
[
__DIR__ . '/src',
__DIR__ . '/tests',
],
);
};Follow the same convention used across PHP Forge repositories:
{
"scripts": {
"ecs": "./vendor/bin/ecs --fix",
"rector": "./vendor/bin/rector process"
}
}