Automatisierte Qualitätssicherung
Code wird manuell geschrieben und unterschiedliche Programme (Visual Code, PhpStorm, ...) bieten unterschiedlich gute Unterstützung bei der Programmierung an. Mit jeder neuen PHP-Version sind neue Features verfügbar, die eine Vereinfachung oder Optiimierung ermöglichen.
Ganz automatisch
Erst wenn Code laufend und automatisiert geprüft wird, kann man von einem echten Nutzen sprechen!
Alle Projekte verwenden für die Verwaltung der Abhängigkeiten (z.B. Plugins & Erweiterungen) Composer. Damit lassen sich die folgenden Tools einbinden und verwenden.
PHP CS Fixer
Der PHP-CS-Fixer (composer req friendsofphp/php-cs-fixer:^3) prüft den Code auf die hinterlegten Regeln ab und kann Code auch dahingehend automatisiert korrigieren. Die Konfiguration wird in der Datei .php-cs-fixer.php abgelegt und folgt den Regel des TYPO3 Core-Projektes.
Folgender Code zeigt den Auruf des Fixers und dessen Ergebnis. 5 Dateien wurden automatisiert geändert.
➜ my-project git:(staging) ./php-cs-fixer fix
Loaded config default from ".....php-cs-fixer.php".
1) packages/theme/Classes/ViewHelpers/Fluid/CategoryViewHelper.php
2) packages/theme/Classes/ViewHelpers/Iterator/ChunkViewHelper.php
3) packages/theme/Configuration/TCA/Overrides/pages.php
4) packages/theme/Configuration/TCA/Overrides/tt_content.php
5) packages/theme/Configuration/TCA/Overrides/tt_content_container.php
Fixed all files in 0.171 seconds, 16.000 MB memory used
Mittels ./php-cs-fixer fix --dry-run kann der eigene Code auch lediglich geprüft werden ohne Änderungen vorzunehmen.
PHPStan
Das Tool PHPStan (composer req saschaegerer/phpstan-typo3:^1) finden Fehler im eigenen Code ohne dass dafür Tests geschrieben müssen. Die statische Codeanalyse prüft den Code auf falsche Typen, Prüfungen die keinen Sinn ergeben und vieles mehr. Das folgende Beispiel zeigt eine Methode, die einen string zurückgibt, aber in der Annotierung wird int angegeben.
Als Ergebnis zeigt PHPStan an: Method Example::fo() should return int but returns string.
In einer einfachen Konfigurationen können neben Ausnahmen auch ein Level angegeben werden das definiert wie streng der Code geprüft wird. Je höher das Level, desto genauer wird der Code geprüft. Dies kann durchaus auch als Gamification gesehen werden und hilft jedem Entwickler*:*in besser zu werden. Die angezeigten Fehler sind im Gegensatz zu PHP-CS-Fixer nicht optische Fehler wie die Verwendung von Leerzeichen statt Tabs sondern können zu realen Problemen auf der Website oder im Webshop führen.
<?php
class Example {
/**
* @return int
*/
public function fo()
{
return 'a string';
}
}
Rector
Rector (composer req rector/rector:^0.12) ist ein großartiges Tool das dazu dient, Code automatisiert zu aktualisieren. Im Gegensatz zum PHP-CS-Fixer, dessen Hauptaufgabe auf Coding Guidelines liegt, können mit rector komplette Methoden und Klassen refaktoriert werden.
Der größte Nutzen ergibt sich dabei nach Upgrades. Mit jeder neuen TYPO3-Versionen werden Schnittstellen verbessert oder erneuert. Diese Änderungen sind gut dokumentiert aber manuelle Änderungen von vielen einzelnen Stellen ist fehleranfällig und langwierig. Dank zahlreicher Unterstützer gibt es für die meisten programmatischen Änderungen aber bei Rector hinterlegte Regeln sodass diese Änderungen automatisiert erfolgen können.
Im täglichen Arbeiten hilft Rector dabei sicherzustellen, dass keine veralteten Schnittstellen verwendet werden.
Vereinfachter Zugriff
Um die Nutzung der Tools zu vereinfachen, erfolgt der Aufruf dieser über composer. In der Sektion scripts können dazu Shortcuts angelegt werden.
Mittels composer cs wird der PHP-CS-Fixer im dry-run aufgerufen und composer csfix werden die Fehler ausgebessert. Ebenso ist es möglich, wie bei composer check, mehrere Aufrufe zu triggern.
"scripts": {
"check": [
"@cs",
"@phpstan",
"@rector"
],
"cs": [
"./php-cs-fixer fix -v --dry-run"
],
"csfix": [
"./php-cs-fixer fix"
],
"phpstan": [
"./phpstan analyze --memory-limit=-1"
],
"rector": [
"./rector process --dry-run packages/"
],
"rectorfix": [
"./rector process packages/"
]
}
Prüfung beim Deployment
Bei jeder Codeänderung wird durch GitLab ein composer check aufgerufen und ein Deployment kann nur dann erfolgen, wenn alle Prüfungen ohne Fehler bestanden wurden.
Fazit
Jedes der genannten Tools hat ihre eigenen Stärken und die Kombination aus allen ermöglicht es, konsistenten Code über das gesamte Team und alle Erweiterungen zu schreiben. Das erleichtert die Zusammenarbeit und vereinfacht zukunftige Erweiterungen und Upgrades.