AddOn-Versionen vergleichen

Quell-ID: GitHub Discussion #41

Use Case

In einem Modul oder AddOn soll geprüft werden, ob eine bestimmte Version eines anderen AddOns installiert ist.

Verwendete AddOns

  • REDAXO Core

Problemstellung

Versionen im Semver-Format (z.B. “1.2.3”) können nicht einfach mit String-Vergleichen verglichen werden.

Lösung

REDAXO bietet die Funktion rex_version::compare():

<?php
$addon = rex_addon::get('my_addon');

// Prüfen ob Version größer als 1.2.3
if (rex_version::compare($addon->getVersion(), '1.2.3', '>')) {
    // Code für neuere Versionen
}

// Prüfen ob Version mindestens 2.0.0
if (rex_version::compare($addon->getVersion(), '2.0.0', '>=')) {
    // Neues Feature nutzen
}

Vergleichsoperatoren

Operator Bedeutung
> größer als
< kleiner als
>= größer oder gleich
<= kleiner oder gleich
= oder == gleich
!= oder <> ungleich

Beispiele

Feature-Check basierend auf AddOn-Version

<?php
$yform = rex_addon::get('yform');

if ($yform->isAvailable()) {
    if (rex_version::compare($yform->getVersion(), '4.0.0', '>=')) {
        // Neue YForm 4.x API verwenden
        $dataset = MyModel::create();
    } else {
        // Alte API für YForm 3.x
        $dataset = rex_yform_manager_dataset::create('rex_my_table');
    }
}

REDAXO Core-Version prüfen

<?php
if (rex_version::compare(rex::getVersion(), '5.15.0', '>=')) {
    // Feature aus REDAXO 5.15+ nutzen
}

Mindestanforderung in package.yml

# package.yml
package: my_addon
version: 1.0.0
requires:
  redaxo: ^5.14
  php: ^8.0
  yform: ^4.0

Besserer Ansatz

Versions-Helper-Klasse

<?php
class VersionHelper
{
    /**
     * Prüft ob ein AddOn in einer Mindestversion verfügbar ist
     */
    public static function addonMinVersion(string $addonName, string $minVersion): bool
    {
        $addon = rex_addon::get($addonName);
        
        if (!$addon->isAvailable()) {
            return false;
        }
        
        return rex_version::compare($addon->getVersion(), $minVersion, '>=');
    }
    
    /**
     * Prüft ob REDAXO in einer Mindestversion läuft
     */
    public static function coreMinVersion(string $minVersion): bool
    {
        return rex_version::compare(rex::getVersion(), $minVersion, '>=');
    }
    
    /**
     * Gibt eine Kompatibilitäts-Warnung aus
     */
    public static function checkCompatibility(): ?string
    {
        $warnings = [];
        
        if (!self::coreMinVersion('5.14.0')) {
            $warnings[] = 'REDAXO 5.14.0 oder höher erforderlich';
        }
        
        if (!self::addonMinVersion('yform', '4.0.0')) {
            $warnings[] = 'YForm 4.0.0 oder höher erforderlich';
        }
        
        return !empty($warnings) ? implode(', ', $warnings) : null;
    }
}

// Verwendung
if ($warning = VersionHelper::checkCompatibility()) {
    echo rex_view::warning($warning);
}

Feature-Flags basierend auf Version

<?php
class Features
{
    public static function hasNewMediaManager(): bool
    {
        return rex_version::compare(rex::getVersion(), '5.13.0', '>=');
    }
    
    public static function hasYFormCallbackObject(): bool
    {
        $yform = rex_addon::get('yform');
        return $yform->isAvailable() && 
               rex_version::compare($yform->getVersion(), '4.0.0', '>=');
    }
}

// Im Code
if (Features::hasNewMediaManager()) {
    // Neue API nutzen
}

Hinweis

Die alte Funktion rex_string::versionCompare() ist seit REDAXO 5.10 deprecated. Verwenden Sie stattdessen immer rex_version::compare().