Estensione supportata su più versioni


8

Quando si crea un'estensione per uso commerciale sarebbe bello se funziona su più versioni di Magento, forse anche CE ed EE.
Ma a volte questo non funziona come previsto perché il nucleo cambia da versione a versione.
La mia domanda riguarda: come devo gestire le piccole modifiche di base che influiscono sulla mia estensione. Non sto parlando di enormi cambiamenti che richiedono un re-factoring.
Ecco un esempio per renderlo più chiaro.
A partire da CE 1.8.1 (e EE 1.13.1) il metodo ha Varien_Io_File::writecambiato il modo in cui funziona (la firma è la stessa) e il metodo è filePutContentapparso che fa qualcosa di simile a quello che writefaceva in precedenza.
In questo momento faccio qualcosa di strano e controllo la versione di Magento per sapere quale metodo utilizzare per ottenere lo stesso risultato

/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
    $io->write($destinationFile, $contents, 0777);
} else {
    $io->filePutContent($destinationFile, $contents);
}

Ora, voglio che funzioni anche su EE. Diventa ancora più brutto perché 1.8.1 è specifico di CE. Quindi il codice sopra diventa

/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
    $io->write($destinationFile, $contents, 0777);
} else {
    $io->filePutContent($destinationFile, $contents);
}

dove il metodo si getCurrentVersionpresenta così

public function getCurrentVersion()
{
    if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
        return '1.13.1';
    }
    return '1.8.1';
}

Il codice sopra è un po 'semplificato (uso costanti appropriate per le versioni nel mio codice reale )

Ma questo funziona per CE 1.7 e versioni successive quando è Mage::getEdition()stato introdotto il metodo . Se voglio che funzioni sulla versione precedente alla ce 1.7 diventa ancora più folle.

Ora immagina di nuovo questo cambiamento nella versione CE 1.11 e EE 1.16. Il caos è destinato a succedere.

C'è un modo più pulito di farlo senza fare ifo casedichiarazioni?


Non mi sono trovato di fronte a quel problema, ma forse la mia opinione può essere utile. Ai fini della leggibilità, probabilmente raggrupperei tutti quei metodi "problematici" nello stesso file, come un aiuto. Inoltre, per l'esempio che hai dato sopra, userei anche la funzione method_exists( method_exists ( mixed $object , string $method_name )), che è meno restrittiva e più affidabile.
Mayers,

@Mayers. Dovresti scrivere questo come una risposta. Sembra un approccio valido. Non perfetto, ma sicuramente valido :)
Marius

Risposte:


3

Non mi sono trovato di fronte a quel problema, ma forse la mia opinione può essere utile. Ai fini della leggibilità, probabilmente raggrupperei tutti quei metodi "problematici" nello stesso file, come un aiuto. Inoltre, per l'esempio che hai dato sopra, userei anche la method_existsfunzione ( http://php.net/manual/en/function.method-exists.php ), che è meno restrittiva e più affidabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.