扩展支持多个版本


8

当创建用于商业用途的扩展时,如果它可以在多个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版本中再次发生这种变化。混乱必将发生。

有没有这样做ifcase声明的更干净的方法?


我没有遇到过这个问题,但也许我的意见会有所帮助。出于可读性考虑,我可能会将所有这些“有问题的”方法分组在一个文件中,例如一个助手。另外,对于您在上面给出的示例,我还将使用method_existsmethod_exists ( mixed $object , string $method_name ))函数,该函数的限制较少且更可靠。
Mayers

@Mayers。您应该将此作为答案。看起来是一种有效的方法。不是一个完美的,但实际上是一个有效的:)
马吕斯

Answers:


3

我没有遇到过这个问题,但也许我的意见会有所帮助。出于可读性考虑,我可能会将所有这些“有问题的”方法分组在一个文件中,例如一个助手。另外,对于您在上面给出的示例,我还将使用该method_exists函数(http://php.net/manual/en/function.method-exists.php),该函数的限制较少且更可靠。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.