Tiện ích mở rộng được hỗ trợ trên nhiều phiên bản


8

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 filePutContentxuất hiện tương tự như những gì đã writelà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 getCurrentVersiontrô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 ifhoặc casetuyên bố?


Tôi đã không phải đối mặt với vấn đề đó, nhưng có lẽ ý kiến ​​của tôi có thể hữu ích. Đối với mục đích dễ đọc, tôi có thể sẽ nhóm tất cả các phương thức "có vấn đề" đó trong cùng một tệp, như một người trợ giúp. Ngoài ra, với ví dụ bạn đã đưa ra ở trên, tôi cũng sẽ sử dụng hàm method_exists( method_exists ( mixed $object , string $method_name )), ít hạn chế hơn và đáng tin cậy hơn.
Mayers

@Mayers. Bạn nên viết điều này như một câu trả lời. Trông giống như một cách tiếp cận hợp lệ. Không phải là một hoàn hảo, nhưng thực sự là một hợp lệ :)
Marius

Câu trả lời:


3

Tôi đã không phải đối mặt với vấn đề đó, nhưng có lẽ ý kiến ​​của tôi có thể hữu ích. Đối với mục đích dễ đọc, tôi có thể sẽ nhóm tất cả các phương thức "có vấn đề" đó trong cùng một tệp, như một người trợ giúp. Ngoài ra, với ví dụ bạn đã đưa ra ở trên, tôi cũng sẽ sử dụng method_existshàm ( http://php.net/manual/en/feft.method-exists.php ), ít hạn chế hơn và đáng tin cậy hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.