drevops/phpcs-standard

DrevOps PHP_CodeSniffer rules: enforce consistent naming (snakeCase or camelCase) for variables and parameters, PHPUnit data provider conventions.

Maintainers

👁 alexdrevops

Package info

github.com/drevops/phpcs-standard

Type:phpcodesniffer-standard

pkg:composer/drevops/phpcs-standard

Fund package maintenance!

drevops

Patreon

Statistics

Installs: 106 014

Dependents: 20

Suggesters: 0

Stars: 4

Open Issues: 0

0.7.0 2026-03-12 23:43 UTC

Suggests

None

Provides

None

Conflicts

None

Replaces

None

GPL-2.0-or-later caee870e84a5c1e41e2047f1c89c98740fa3a2c1

phpunitstandardscamelcasesnakecasephpcsPHPCodeSniffernaming-conventionscode-qualitydata-providers

This package is auto-updated.

Last update: 2026-06-17 13:09:08 UTC


README

👁 DrevOps PHP_CodeSniffer Standard logo

DrevOps PHP_CodeSniffer Standard

👁 GitHub Issues
👁 GitHub Pull Requests
👁 Test PHP
👁 codecov
👁 GitHub release (latest by date)
👁 LICENSE
👁 Renovate

👁 Vortex Ecosystem

PHP_CodeSniffer standard enforcing:

  • Consistent naming conventions for local variables and function/method parameters (configurable: snakeCase or camelCase)
  • PHPUnit data provider naming conventions and organization

Installation

composer require --dev drevops/phpcs-standard

The standard is automatically registered via phpcodesniffer-composer-installer.

Verify: vendor/bin/phpcs -i (should list DrevOps)

Usage

# Check code
vendor/bin/phpcs --standard=DrevOps path/to/code

# Auto-fix
vendor/bin/phpcbf --standard=DrevOps path/to/code

Configuration

Create phpcs.xml:

<?xml version="1.0"?>
<ruleset name="Project Standards">
 <rule ref="DrevOps"/>
 <file>src</file>
 <file>tests</file>
</ruleset>

Use individual sniffs:

<ruleset name="Custom Standards">
 <!-- Naming Conventions -->
 <rule ref="DrevOps.NamingConventions.LocalVariableNaming"/>
 <rule ref="DrevOps.NamingConventions.ParameterNaming"/>

 <!-- Testing Practices -->
 <rule ref="DrevOps.TestingPractices.DataProviderPrefix"/>
 <rule ref="DrevOps.TestingPractices.DataProviderMatchesTestName"/>
 <rule ref="DrevOps.TestingPractices.DataProviderOrder"/>
</ruleset>

Configure naming convention

By default, both sniffs enforce snakeCase. Configure to use camelCase:

<ruleset name="Custom Standards">
 <rule ref="DrevOps.NamingConventions.LocalVariableNaming">
 <properties>
 <property name="format" value="camelCase"/>
 </properties>
 </rule>

 <rule ref="DrevOps.NamingConventions.ParameterNaming">
 <properties>
 <property name="format" value="camelCase"/>
 </properties>
 </rule>
</ruleset>

LocalVariableNaming

Enforces consistent naming convention for local variables inside functions/methods.

With snakeCase (default):

function processOrder() {
 $order_id = 1; // ✓ Valid
 $orderId = 1; // ✗ Error: NotSnakeCase
}

With camelCase:

function processOrder() {
 $orderId = 1; // ✓ Valid
 $order_id = 1; // ✗ Error: NotCamelCase
}

Excludes:

  • Function/method parameters (handled by ParameterNaming)
  • Class properties (not enforced)
  • Reserved variables ($this, $_GET, $_POST, etc.)

Error codes

  • DrevOps.NamingConventions.LocalVariableNaming.NotSnakeCase (when format="snakeCase")
  • DrevOps.NamingConventions.LocalVariableNaming.NotCamelCase (when format="camelCase")

Ignore

// phpcs:ignore DrevOps.NamingConventions.LocalVariableNaming.NotSnakeCase
$myVariable = 'value';

ParameterNaming

Enforces consistent naming convention for function/method parameters.

With snakeCase (default):

function processOrder($order_id, $user_data) { // ✓ Valid
function processOrder($orderId, $userData) { // ✗ Error: NotSnakeCase

With camelCase:

function processOrder($orderId, $userData) { // ✓ Valid
function processOrder($order_id, $user_data) { // ✗ Error: NotCamelCase

Excludes:

  • Parameters inherited from interfaces/parent classes
  • Parameters in interface/abstract method declarations
  • Class properties (including promoted constructor properties)

Error codes

  • DrevOps.NamingConventions.ParameterNaming.NotSnakeCase (when format="snakeCase")
  • DrevOps.NamingConventions.ParameterNaming.NotCamelCase (when format="camelCase")

Ignore

// phpcs:ignore DrevOps.NamingConventions.ParameterNaming.NotSnakeCase
function process($legacyParam) {}

DataProviderPrefix

Enforces consistent naming prefix for PHPUnit data provider methods.

class MyTest extends TestCase {
 /**
 * @dataProvider dataProviderUserLogin
 */
 public function testUserLogin($data) {}

 public function dataProviderUserLogin() { // ✓ Valid
 return [];
 }

 public function providerUserLogin() { // ✗ Error: InvalidPrefix
 return [];
 }
}

Configuration

Customize the required prefix:

<rule ref="DrevOps.TestingPractices.DataProviderPrefix">
 <properties>
 <property name="prefix" value="dataProvider"/>
 </properties>
</rule>

Error code

DrevOps.TestingPractices.DataProviderPrefix.InvalidPrefix

Ignore

// phpcs:ignore DrevOps.TestingPractices.DataProviderPrefix.InvalidPrefix
public function providerCustom() {}

Auto-fixing

This sniff supports auto-fixing with phpcbf:

  • Renames provider methods to use the correct prefix
  • Updates all @dataProvider annotations to reference the new name

DataProviderMatchesTestName

Ensures data provider method names match their test method names.

class MyTest extends TestCase {
 /**
 * @dataProvider dataProviderUserLogin
 */
 public function testUserLogin($data) {}

 public function dataProviderUserLogin() { // ✓ Valid - ends with "UserLogin"
 return [];
 }

 public function dataProviderLogin() { // ✗ Error: InvalidProviderName
 return []; // Expected: ends with "UserLogin"
 }
}

Supported formats:

  • @dataProvider annotations
  • #[DataProvider('methodName')] attributes (PHP 8+)

Excludes:

  • External providers (ClassName::methodName)
  • Non-test methods
  • Non-test classes

Error code

DrevOps.TestingPractices.DataProviderMatchesTestName.InvalidProviderName

Ignore

// phpcs:ignore DrevOps.TestingPractices.DataProviderMatchesTestName.InvalidProviderName
public function dataProviderCustomName() {}

DataProviderOrder

Enforces structural organization of test and data provider methods.

class MyTest extends TestCase {
 // ✓ Valid - provider after test (default)
 /**
 * @dataProvider dataProviderUserLogin
 */
 public function testUserLogin($data) {}

 public function dataProviderUserLogin() {
 return [];
 }
}

Helper methods between tests and providers are allowed:

class MyTest extends TestCase {
 /**
 * @dataProvider dataProviderUserLogin
 */
 public function testUserLogin($data) {}

 private function helperMethod() {} // ✓ Allowed

 public function dataProviderUserLogin() {
 return [];
 }
}

Configuration

Reverse the ordering (provider before test):

<rule ref="DrevOps.TestingPractices.DataProviderOrder">
 <properties>
 <property name="providerPosition" value="before"/>
 </properties>
</rule>

Options:

  • after (default) - Providers must appear after their test methods
  • before - Providers must appear before their test methods

Error codes

  • DrevOps.TestingPractices.DataProviderOrder.ProviderBeforeTest - Provider appears before test (when providerPosition="after")
  • DrevOps.TestingPractices.DataProviderOrder.ProviderAfterTest - Provider appears after test (when providerPosition="before")

Ignore

// phpcs:ignore DrevOps.TestingPractices.DataProviderOrder.ProviderBeforeTest
public function dataProviderUserLogin() {}

Development

composer install # Install dependencies
composer test # Run tests
composer test-coverage # Run tests with coverage
composer lint # Check code standards
composer lint-fix # Fix code standards

License

GPL-3.0-or-later

This repository was created using the Scaffold project template