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::write
mudou a maneira como funciona (a assinatura é a mesma) e o método filePutContent
apareceu write
fazendo 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 getCurrentVersion
parece 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 if
ou fazer case
declarações?
fonte
method_exists
(method_exists ( mixed $object , string $method_name )
), que é menos restritiva e mais confiável.Respostas:
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_exists
função ( http://php.net/manual/en/function.method-exists.php ), que é menos restritiva e mais confiável.fonte