Export your composer based extension for non composer TYPO3 installation

Een extensie die gebruikt maakt van composer installeren in een non-composer typo3 installatie? Dat kan, mits je even je extensie compatible maakt voor autoloading en de dependencies binnentrekt.

Problemen gebruik composer in non composer installatie

Je hebt een extensie voor TYPO3 gemaakt die composer gebruikt, en nu wil je deze gebruiken in een non-composer TYPO3 installatie. Het eerste issue waar je vast tegen aan loopt is dat TYPO3 de klasse niet juist inlaadt. Het tweede issue is op welke manier haal je de gebruikte libraries binnen en kan je nog steeds gebruik maken van de voordelen van het package management (composer).

De oplossing is een ‘archive’ van je extensie te maken door middel van composer. Deze kun je dan vervolgens gebruiken om in een non composer TYPO3 installatie te gebruiken.

Stap 1 – definiëren van gebruikte php libraries

In de map `Resources/Private/Php` maak je een composer.json file aan die de externe php packages binnentrekt. De dependencies op TYPO3 extensies hoef je niet toe te voegen aangezien deze los in TYPO3 geïnstalleerd worden. Na het toevoegen van je dependencies kun je deze installeren via `composer install`.

Stap 2 – autoloading van klasses binnen de extensie

Nadat de packages zijn binnengehaald dienen we nog de autoload aan te roepen zodat de packages en klasses beschikbaar zijn. In TYPO3 is het aanbevolen om de autoload in `ext_localconf.php` te doen. Als TYPO3 niet via composer is geïnstalleerd, dan worden de packages ingeladen door middel van de volgende code:

if (!\TYPO3\CMS\Core\Core\Bootstrap::usesComposerClassLoading()) {
    $composerAutoloadFile = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath($_EXTKEY)
        . 'Resources/Private/PHP/autoload.php';
     require_once($composerAutoloadFile);
}

Stap 3 – Een archive maken van de extensie

Als laatste dien je een archive/zip package aan te maken die je vervolgens kunt gebruiken om je extensie te uploaden in de extensionmanager of naar de TER. Dit kan via cmdline makkelijk via het commando:

zip -9 -r --exclude=*.git* yourextension.zip .

Dit zou je nog kunnen optimaliseren door een script toe te voegen aan je root composer.json file in je extensie. Dit script zal dan automatisch de composer install en archive voor je uitvoeren:

"scripts": {
        "package": "cd Resources/Private/ && composer install && cd ../../ && zip -9 -r --exclude=*.git* yourextension.zip ."
    }      
}

Bronnen en voorbeeld

Een voorbeeld waarbij we dit principe hebben toegepast is de mautic-typo3 extensie. Zie de volgende commit: https://github.com/mautic/mautic-typo3/commit/fd5e5b92cc5b7e800cd6d53be2ee3b96edf4220c#diff-b5d0ee8c97c7abd7e3fa29b9a27d1780
Bovenstaand idee is gebaseerd op basis van de typo3 extensie `https://github.com/cedricziel/typo3-ext-slugify` die op een vergelijkbare wijze de extensie `cocur/slugify` compatible maakt voor non composer TYPO3 installatie.

Let op, de hierboven beschreven methode kan problemen geven in installaties waar meerdere zelfde packages gebruikt worden in verschillende extensies. Het is raadzaam om, wanneer het de mogelijkheid biedt, over te gaan om TYPO3 te installeren via composer.

< Terug naar overzicht

Ruud Silvrants

Developer

TYPO3 tovenaar. Duikt ook in webapplicaties. Laat zich nooit opjagen. Heeft eindelijk teckel Meggie zindelijk gekregen. 

#TYPO3 #HTML/CSS #PHP