Saat membuat ekstensi untuk penggunaan komersial, alangkah baiknya jika bekerja pada beberapa versi Magento, mungkin CE dan EE juga.
Tetapi kadang-kadang ini tidak berfungsi seperti yang direncanakan karena inti berubah dari versi ke versi.
Pertanyaan saya adalah tentang, bagaimana saya harus menangani perubahan inti kecil yang memengaruhi ekstensi saya. Saya tidak berbicara tentang perubahan besar yang membutuhkan re-factoring.
Berikut adalah contoh untuk membuatnya lebih jelas.
Mulai CE 1.8.1 (dan EE 1.13.1) metode Varien_Io_File::write
mengubah cara kerjanya (tanda tangannya sama) dan metode filePutContent
muncul yang melakukan sesuatu yang mirip dengan yang write
digunakan sebelumnya.
Saat ini saya melakukan sesuatu yang gila dan memeriksa versi Magento untuk mengetahui metode apa yang digunakan untuk mencapai hasil yang sama
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
Sekarang, saya ingin ini bekerja pada EE juga. Itu menjadi lebih buruk karena 1.8.1 khusus untuk CE. Jadi kode di atas menjadi
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
di mana metodenya getCurrentVersion
terlihat seperti ini
public function getCurrentVersion()
{
if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
return '1.13.1';
}
return '1.8.1';
}
Kode di atas sedikit disederhanakan (saya menggunakan konstanta yang tepat untuk versi dalam kode asli saya )
Tapi ini bekerja untuk CE 1.7 dan di atasnya ketika metode Mage::getEdition()
itu diperkenalkan. Jika saya ingin itu bekerja pada versi sebelum CE 1.7 itu menjadi lebih gila.
Sekarang bayangkan ini berubah lagi dalam versi CE 1.11 dan EE 1.16. Kekacauan pasti akan terjadi.
Apakah ada cara yang lebih bersih untuk melakukan ini tanpa melakukan if
atau case
pernyataan?
method_exists
(method_exists ( mixed $object , string $method_name )
), yang kurang membatasi dan lebih dapat diandalkan.