Magento中不同的* get helper *方法有什么区别?

时间:2012-02-17 19:53:34

标签: magento

我已经看到了几种不同的方法来获得特定的helper,我希望有人可以解释每种方法的优缺点。例如,在template/checkout/cart/sidebar/default.phtml中,您会看到$this->helper('checkout')Mage::helper('checkout')。这两种方法在同一模板中有充分的理由吗?

以下是我在Magento找到帮手的所有不同方式:

abstract class Mage_Core_Block_Abstract extends Varien_Object
{
…
    /**
     * Return block helper
     *
     * @param string $type
     * @return Mage_Core_Block_Abstract
     */
    public function getHelper($type)
    {
        return $this->getLayout()->getBlockSingleton($type);
    }

    /**
     * Returns helper object
     *
     * @param string $name
     * @return Mage_Core_Block_Abstract
     */
    public function helper($name)
    {
        if ($this->getLayout()) {
            return $this->getLayout()->helper($name);
        }
        return Mage::helper($name);
    }
…
}

class Mage_Core_Model_Layout extends Varien_Simplexml_Config
{
…
    /**
     * Enter description here...
     *
     * @param string $type
     * @return Mage_Core_Helper_Abstract
     */
    public function getBlockSingleton($type)
    {
        if (!isset($this->_helpers[$type])) {
            $className = Mage::getConfig()->getBlockClassName($type);
            if (!$className) {
                Mage::throwException(Mage::helper('core')->__('Invalid block type: %s', $type));
            }

            $helper = new $className();
            if ($helper) {
                if ($helper instanceof Mage_Core_Block_Abstract) {
                    $helper->setLayout($this);
                }
                $this->_helpers[$type] = $helper;
            }
        }
        return $this->_helpers[$type];
    }

    /**
     * Retrieve helper object
     *
     * @param   string $name
     * @return  Mage_Core_Helper_Abstract
     */
    public function helper($name)
    {
        $helper = Mage::helper($name);
        if (!$helper) {
            return false;
        }
        return $helper->setLayout($this);
    }
…
}

1 个答案:

答案 0 :(得分:10)

Mage_Core_Block_Abstract::getHelper()

Mage_Core_Model_Layout::getBlockSingleton()方法不返回Magento辅助对象,而是返回Magento对象类型块的实例。
我相信这是遗留代码,例如Mage::getBlockSingleton()方法已被弃用。

在这两种情况下,都会根据Magento类ID创建一个块实例。

方法getBlockSingleton()将实例存储在布局对象的$_helpers属性中,方法createBlock()会将其存储在$_blocks属性中。

使用布局XML只能引用(和覆盖)$_blocks数组中的块。

如果您想要特定块类的实例,并且您希望确保不创建块的新实例(如果已存在),则方法getBlockSingleton()非常有用。
要通过createBlock()创建的实例(几乎)实现相同的效果,您需要以下代码:

public function alternativeGetBlockSingleton($classId)
{
    foreach (Mage::app()->getLayout()->getAllBlocks() as $block)
    {
        if ($block->getType() == $classId)
        {
            return $block;
        }
    }
    return $this->createBlock($classId);
}

Mage_Core_Block_Abstract::helper()

Mage_Core_Block_Abstract::helper()方法返回Magento中通常被称为帮助者的实例。
直接调用Mage::helper($name)的唯一区别是布局对象被设置为辅助实例上的属性。

有人可能会说,在模板文件中使用$this->helper()Mage::helper()更清晰,因为它会减少硬编码引用的数量(从而减少依赖性)到Mage类,但是Magento认为这个论点是徒劳的,因为每个模块都非常依赖于Mage和一些Mage_Core类。

在实践中,除了Mage::helper()更为常见和众所周知之外,可能没有其它功能性的理由,但是其他开发人员阅读代码会更加困惑,这使得它更易于维护

另一方面,Magento完全是选择,并有很多方法可以完成某项任务。