Anleitung zur Verwendung von PHP_CodeSniffer mit Symfony und GIT pre-commit Hook

Ziel: Sicherstellen, dass dein PHP-Code den definierten Codierungsstandards entspricht, bevor er ins Repository gepusht wird. Dies erfolgt durch Integration von PHP_CodeSniffer mit PHPUnit in einem pre-commit Hook.


1. Installation von PHP_CodeSniffer

  1. Installiere PHP_CodeSniffer via Composer:
composer require --dev squizlabs/php_codesniffer
  1. Überprüfe die verfügbaren Standards
./vendor/bin/phpcs -i

Dieser Befehl zeigt eine Liste aller verfügbaren Coding-Standards an. Bspw:

The installed coding standards are MySource, PEAR, PSR1, PSR2, PSR12, Squiz and Zend

2. Konfiguration von PHP_CodeSniffer

  1. Erstelle/konfiguriere eine phpcs.xml.dist im Root-Verzeichnis:
<?xml version="1.0"?>
<ruleset name="CustomRules">
    <file>src</file>
    <file>tests</file>
    
    <!-- Verwenden Sie die PSR-12-Regel als Basis -->
    <rule ref="PSR12"/>

    <!-- Prüfen auf TODO-Kommentare -->
    <rule ref="Generic.Commenting.Todo"/>
</ruleset>
  1. Konfiguriere das phpcs-Tool in deiner phpunit.xml.dist:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
    bootstrap="vendor/autoload.php"
    colors="true"
    verbose="true"
    stopOnFailure="false"
    failOnWarning="true"
    failOnRisky="true"
    stopOnError="false"
    stopOnWarning="false"
>
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>

    <!-- Optional: PHPUnit Listener für PHP_CodeSniffer Integration -->
    <listeners>
        <listener class="PHP_CodeSniffer\Standards\PHPUnit\PHPUnitListener">
            <arguments>
                <string>--standard=PSR12</string>
            </arguments>
        </listener>
    </listeners>
</phpunit>


3. Integration in den GIT pre-commit Hook

  1. Erstelle (oder ergänze) den pre-commit Hook in .git/hooks/pre-commit
#!/bin/sh

# Listet alle Dateien auf, die für den Commit vorgemerkt sind
staged_files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.php$')

# Wenn keine PHP-Dateien im Commit sind, überspringe die Überprüfung
if [ -z "$staged_files" ]; then
    echo "Keine PHP-Dateien zum Überprüfen."
    exit 0
fi

# Ausführen von PHP_CodeSniffer nur auf den vorgemerkten Dateien
./vendor/bin/phpcs -n $staged_files
if [ $? -ne 0 ]; then
    echo "PHP_CodeSniffer hat Fehler in den vorgemerkten Dateien gefunden. Commit wird abgebrochen."
    exit 1
fi
  1. Mach den pre-commit Hook ausführbar:
chmod +x .git/hooks/pre-commit

4. Wichtige Ausgaben verstehen

  • phpcs: Zeigt Verstöße gegen die Coding-Standards an.
  • phpcbf: Automatische Korrektur von einfachen Verstößen.
./vendor/bin/phpcs -n # Der Schalter -n unterdrückt harmlose Warnings
./vendor/bin/phpcbf --standard=phpcs.xml.dist src/

Natürlich können phpcs und phpcbf mit einzelnen Dateien aufgerufen werden.

  • Fehler und Warnungen: Werden als „ERROR“ oder „WARNING“ gekennzeichnet.
  • Details zur Korrektur: Werden spezifisch zu den betroffenen Dateien und Zeilen angezeigt.

5. Fazit

Mit dieser Integration stellst du sicher, dass dein Code den Coding-Standards entspricht und Tests erfolgreich durchlaufen, bevor du deine Änderungen ins Repository pusht. Dies verbessert die Codequalität und reduziert potenzielle Fehler im Produktionscode erheblich.