Ekstensi didukung pada banyak versi

8

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::writemengubah cara kerjanya (tanda tangannya sama) dan metode filePutContentmuncul yang melakukan sesuatu yang mirip dengan yang writedigunakan 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 getCurrentVersionterlihat 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 ifatau casepernyataan?

Marius
sumber
Saya belum pernah berhadapan dengan masalah itu, tapi mungkin pendapat saya bisa membantu. Untuk tujuan keterbacaan, saya mungkin akan mengelompokkan semua metode "bermasalah" dalam file yang sama, seperti bantuan. Juga, untuk contoh yang Anda berikan di atas, saya juga akan menggunakan fungsi method_exists( method_exists ( mixed $object , string $method_name )), yang kurang membatasi dan lebih dapat diandalkan.
Mayers
@Mayers. Anda harus menulis ini sebagai jawaban. Sepertinya pendekatan yang valid. Bukan yang sempurna, tapi yang valid memang :)
Marius

Jawaban:

3

Saya belum pernah berhadapan dengan masalah itu, tapi mungkin pendapat saya bisa membantu. Untuk tujuan keterbacaan, saya mungkin akan mengelompokkan semua metode "bermasalah" dalam file yang sama, seperti bantuan. Juga, untuk contoh yang Anda berikan di atas, saya juga akan menggunakan method_existsfungsi ( http://php.net/manual/en/function.method-exists.php ), yang kurang membatasi dan lebih dapat diandalkan.

Mayers
sumber