For coders TYPO3 Tech Corner

[TYPO3] Mit rector alte Extensions automatisch erneuern lassen

[TYPO3] Mit rector alte Extensions automatisch erneuern lassen

Ich denke, dass viele von uns schon einmal vor der Hürde standen, eine alte Extension, die nicht mehr gepflegt wird, für eine neue TYPO3-Version wieder zum Laufen zu bekommen. Das ist mitunter sehr viel händische Arbeit. Hierzu gibt es mit dem PHP-Paket rector/rector eine automatisierte Lösung, die direkt Änderungen im Code von Extensions vornehmen kann.

Rector installieren und konfigurieren

Installieren lässt sich rector über composer ganz leicht:

 

composer require --dev rector/rector

 

 

Anschließend kann man eine Konfigurationsdatei für TYPO3 automatisch erstellen lassen:

 

./vendor/bin/rector init --template-type=typo3

 

 

Diese Datei (rector.php) liegt nun in eurem Projekt-Root-Verzeichnis. Hier könnt ihr noch einstellen, auf welche Änderungen im Code eurer Extension geprüft werden soll. Wichtig dabei sind vor allem die SetLists und die einzelnen Services, die man dazu laden kann. Nachfolgend ein stark vereinfachtes Beispiel für eine Konfiguration einer TYPO3-Extension die für TYPO3 8 erstellt wurde, aber jetzt in TYPO3 10 benötigt wird:

 

<?php ... return static function (ContainerConfigurator $containerConfigurator): void { // get parameters $parameters = $containerConfigurator->parameters(); $containerConfigurator->import(Typo3SetList::TYPO3_87); $containerConfigurator->import(Typo3SetList::TYPO3_95); $containerConfigurator->import(Typo3SetList::TYPO3_104); $containerConfigurator->import(Typo3SetList::TYPOSCRIPT_CONDITIONS_95); $containerConfigurator->import(Typo3SetList::TYPOSCRIPT_CONDITIONS_104); $containerConfigurator->import(Typo3SetList::COMPOSER_PACKAGES_87_EXTENSIONS); $containerConfigurator->import(Typo3SetList::COMPOSER_PACKAGES_95_CORE); $containerConfigurator->import(Typo3SetList::COMPOSER_PACKAGES_95_EXTENSIONS); $containerConfigurator->import(Typo3SetList::COMPOSER_PACKAGES_104_CORE); $containerConfigurator->import(Typo3SetList::COMPOSER_PACKAGES_104_EXTENSIONS); $containerConfigurator->import(Typo3SetList::COMPOSER_PACKAGES_TER_TO_PACKAGIST); $containerConfigurator->import(Typo3SetList::DATABASE_TO_DBAL); $containerConfigurator->import(\Ssch\TYPO3Rector\Set\Extension\NimutTestingFrameworkSetList::NIMUT_TESTING_FRAMEWORK_TO_TYPO3_TESTING_FRAMEWORK); $containerConfigurator->import(Typo3SetList::EXTBASE_COMMAND_CONTROLLERS_TO_SYMFONY_COMMANDS); ... $services = $containerConfigurator->services(); $services->set(\Ssch\TYPO3Rector\Rector\General\ConvertTypo3ConfVarsRector::class); $services->set(\Ssch\TYPO3Rector\FileProcessor\Fluid\Rector\DefaultSwitchFluidRector::class); $services->set(\Ssch\TYPO3Rector\FileProcessor\Yaml\Form\Rector\EmailFinisherRector::class); $services->set(\Ssch\TYPO3Rector\Rector\General\ExtEmConfRector::class); $services->set(\Ssch\TYPO3Rector\FileProcessor\TypoScript\Visitors\ExtbasePersistenceVisitor::class); $services->set(\Ssch\TYPO3Rector\FileProcessor\Composer\Rector\ExtensionComposerRector::class); $services->set(\Ssch\TYPO3Rector\FileProcessor\Resources\Icons\Rector\IconsRector::class); $services->set(\Ssch\TYPO3Rector\Rector\Experimental\OptionalConstructorToHardRequirementRector::class); $services->set(\Ssch\TYPO3Rector\FileProcessor\Composer\Rector\RemoveCmsPackageDirFromExtraComposerRector::class); $services->set(\Ssch\TYPO3Rector\Rector\Migrations\RenameClassMapAliasRector::class); $services->set(\Ssch\TYPO3Rector\FileProcessor\FlexForms\Rector\RenderTypeFlexFormRector::class); $services->set(\Ssch\TYPO3Rector\FileProcessor\TypoScript\Visitors\FileIncludeToImportStatementVisitor::class); ...

 

 

Und schon könnt ihr eure Dateien automatisch modernisieren lassen:

 

# Test which files can be changed ./vendor/bin/rector process private/typo3conf/ext/extensionkey --dry-run # Change files now ./vendor/bin/rector process private/typo3conf/ext/extensionkey

 

 

Best practice mit rector

Rector ist zweifeillos ein tolles Stück Software, das auch noch täglich verbessert wird. Der Einsatz kann euch viele Stunden Bastelei, Recherche und vor allem "Trial and Error" ersparen.

Dennoch kann es aber sein, dass morgen schon eine neue Regel dazukommt, die heute noch vermisst wird. Darüber hinaus muss man vielleicht auch damit leben, dass nicht jede Zeile Code automatisch umgewandelt werden kann. Für einige Methoden gibt es eventuell mehrere Wege, bei denen händisch eingegriffen werden muss. Andere Ersetzungen sind vielleicht nicht ganz so perfekt, wie man sich das selber wünscht.

Daher schlagen wir eine Kombination aus automatisierter und manueller Überarbeitung vor. Mit Hilfe von GIT könnt ihr beispielsweise eure Änderungen in der Extension commiten. Wenn also im Anschluss automatische Anpassungen gemacht werden, könnt ihr in eurer IDE die Änderungen kontrollieren und akzeptieren oder zurückrollen. Beispielsweise zeigt euch PhpStorm ganz genau was geändert wurde.

Tip: Beim Vergleich sollten ihr "Ignore whitespace" anhaken, wenn beispielsweise von Tabs auf Spaces geändert wurde, damit euch die eigentlichen Code-Änderungen nicht "durchrutschen".

Übrigens: Neben den Regeln speziell für TYPO3 gibt es auch noch eine ganze Reihe von allgemeinen PHP-Einstellungen. Gerade wenn sich die PHP-Version eurer TYPO3-Instanz ändert, lohnt sich hier ein Blick.

Zurück

Kennst du das: Immer nur schnell schnell?

Wie wäre es einmal mit Zeit und Respekt für Codequalität? Arbeiten im Team? Automatisierte Tests?

Komm zu uns