Khi tạo một tiện ích mở rộng cho mục đích thương mại, sẽ rất tuyệt nếu nó hoạt động trên nhiều phiên bản Magento, có thể cả CE và EE.
Nhưng đôi khi điều này không hoạt động như kế hoạch vì cốt lõi thay đổi từ phiên bản sang phiên bản.
Câu hỏi của tôi là về cách tôi nên xử lý các thay đổi cốt lõi nhỏ ảnh hưởng đến tiện ích mở rộng của mình. Tôi không nói về những thay đổi lớn đòi hỏi phải bao thanh toán lại.
Dưới đây là một ví dụ để làm cho nó rõ ràng hơn.
Bắt đầu CE 1.8.1 (và EE 1.13.1), phương thức Varien_Io_File::write
đã thay đổi cách thức hoạt động (chữ ký giống nhau) và phương thức filePutContent
xuất hiện tương tự như những gì đã write
làm trước đây.
Ngay bây giờ tôi làm gì đó hacky và kiểm tra phiên bản Magento để biết nên sử dụng phương pháp nào để đạt được kết quả tương tự
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
Bây giờ, tôi muốn nó cũng hoạt động trên EE Nó thậm chí còn xấu hơn vì 1.8.1 đặc trưng cho CE. Vì vậy, mã ở trên trở thành
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
phương pháp getCurrentVersion
trông như thế này
public function getCurrentVersion()
{
if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
return '1.13.1';
}
return '1.8.1';
}
Mã ở trên được đơn giản hóa một chút (tôi sử dụng hằng số thích hợp cho các phiên bản trong mã thực của mình )
Nhưng điều này hoạt động cho CE 1.7 trở lên khi phương thức Mage::getEdition()
được giới thiệu. Nếu tôi muốn nó hoạt động trên phiên bản trước ce 1.7, nó thậm chí còn điên hơn.
Bây giờ hãy tưởng tượng điều này thay đổi một lần nữa trong phiên bản CE 1.11 và EE 1.16. Sự hỗn loạn chắc chắn sẽ xảy ra.
Có cách nào sạch hơn để làm điều này mà không làm if
hoặc case
tuyên bố?
method_exists
(method_exists ( mixed $object , string $method_name )
), ít hạn chế hơn và đáng tin cậy hơn.