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