Расширение поддерживается на нескольких версиях

8

При создании расширения для коммерческого использования было бы неплохо, если бы оно работало на нескольких версиях Magento, может быть, также CE и EE.
Но иногда это не работает, как планировалось, потому что ядро ​​меняется от версии к версии.
Мой вопрос о том, как мне справиться с небольшими изменениями ядра, которые влияют на мое расширение. Я не говорю об огромных изменениях, которые требуют ре-факторинга.
Вот пример, чтобы прояснить это.
Начиная с CE 1.8.1 (и EE 1.13.1) метод Varien_Io_File::writeизменил способ, которым он работает (сигнатура та же), и filePutContentпоявился метод, который делает нечто похожее на то, что writeраньше делало.
Прямо сейчас я делаю что-то хакерское и проверяю версию Magento, чтобы узнать, какой метод использовать для достижения того же результата.

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

Теперь, если я хочу, чтобы это работало на EE, оно стало еще более уродливым, потому что 1.8.1 специфичен для CE. Таким образом, код выше становится

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

где метод getCurrentVersionвыглядит так

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

Приведенный выше код немного упрощен (я использую правильные константы для версий в моем реальном коде )

Но это работает для CE 1.7 и выше, когда метод Mage::getEdition()был введен. Если я хочу, чтобы это работало над версией до CE 1.7, это становится еще более безумным.

Теперь представьте, что это снова изменится в версии CE 1.11 и EE 1.16. Хаос обязательно случится.

Есть ли более чистый способ сделать это без действий ifили caseзаявлений?

Мариус
источник
Я не сталкивался с этой проблемой, но, возможно, мое мнение может быть полезным. Для удобства чтения я бы, вероятно, сгруппировал все эти «проблемные» методы в одном файле, как помощник. Кроме того, для приведенного выше примера я бы также использовал функцию method_exists( method_exists ( mixed $object , string $method_name )), которая является менее строгой и более надежной.
Майерс
@Mayers. Вы должны написать это как ответ. Похоже, правильный подход. Не идеальный, но действительно действительный :)
Мариус

Ответы:

3

Я не сталкивался с этой проблемой, но, возможно, мое мнение может быть полезным. Для удобства чтения я бы, вероятно, сгруппировал все эти «проблемные» методы в одном файле, как помощник. Кроме того, для приведенного выше примера я бы также использовал method_existsфункцию ( http://php.net/manual/en/function.method-exists.php ), которая является менее строгой и более надежной.

Майерсом
источник