Extensão suportada em várias versões

8

Ao criar uma extensão para uso comercial, seria bom se funcionasse em várias versões do Magento, talvez também CE e EE.
Mas às vezes isso não funciona como planejado, porque o núcleo muda de versão para versão.
Minha pergunta é sobre como lidar com as pequenas alterações no núcleo que afetam minha extensão. Não estou falando de grandes mudanças que exigem uma re-fatoração.
Aqui está um exemplo para torná-lo mais claro.
A partir do CE 1.8.1 (e EE 1.13.1), o método Varien_Io_File::writemudou a maneira como funciona (a assinatura é a mesma) e o método filePutContentapareceu writefazendo algo semelhante ao que costumava fazer anteriormente.
No momento, faço algo hacky e verifico a versão do Magento para saber qual método usar para obter o mesmo resultado.

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

Agora, também quero que isso funcione no EE. Fica ainda mais feio porque o 1.8.1 é específico para o CE. Portanto, o código acima se torna

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

onde o método se getCurrentVersionparece com isso

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

O código acima é um pouco simplificado (eu uso constantes adequadas para versões no meu código real )

Mas isso funciona para o CE 1.7 e superior quando o método Mage::getEdition()foi introduzido. Se eu quiser que ele funcione na versão anterior à ce 1.7, fica ainda mais louco.

Agora imagine que isso muda novamente na versão CE 1.11 e EE 1.16. O caos está prestes a acontecer.

Existe uma maneira mais limpa de fazer isso sem fazer ifou fazer casedeclarações?

Marius
fonte
Não fui confrontado com esse problema, mas talvez minha opinião possa ser útil. Para fins de legibilidade, provavelmente agruparia todos esses métodos "problemáticos" no mesmo arquivo, como um auxiliar. Além disso, para o exemplo que você deu acima, eu também usaria a função method_exists( method_exists ( mixed $object , string $method_name )), que é menos restritiva e mais confiável.
Mayers
@Mayers. Você deve escrever isso como uma resposta. Parece uma abordagem válida. Não é perfeito, mas é válido mesmo :) #
Marius

Respostas:

3

Não fui confrontado com esse problema, mas talvez minha opinião possa ser útil. Para fins de legibilidade, provavelmente agruparia todos esses métodos "problemáticos" no mesmo arquivo, como um auxiliar. Além disso, para o exemplo que você deu acima, eu também usaria a method_existsfunção ( http://php.net/manual/en/function.method-exists.php ), que é menos restritiva e mais confiável.

Mayers
fonte