我可以在Observer中定义构造函数和私有变量吗?

时间:2013-12-07 12:30:48

标签: magento magento-1.7

我在config.xml中定义的观察者中有两种方法。

如果我想在observer.php中添加其他方法,它们将不会捕获任何事件:

我应该将它们定义为config.xml吗? 如果我放了一些像private $myvar这样的变量,我能用它们吗?

我可以使用构造函数吗?

3 个答案:

答案 0 :(得分:3)

Magento的观察员就像任何其他人一样。您可以添加构造函数,私有变量或任何其他您喜欢的类元素,而不必将它们添加到config.xml。

例如,您可以创建一个这样的观察者类:

<?php
class Companyname_Modulename_Model_Observer {

  private $monkey = 'hi, I am a monkey';

  public function __construct() {
    $this->monkey = 'hi, I am still a monkey';
  }

  public function myObserverFunction($observer) {
    var_dump($this->showMonkeyString());
  }

  private function showMonkeyString() {
    return $this->monkey;
  }
}

在config.xml中,您只添加要在事件发生时执行的函数,例如:

  <frontend>
        <events>
            <catalog_category_load_after>
                <observers>
                    <does_not_matter_what_we_call_this_tag>
                        <type>singleton</type>
                        <class>Companyname_Modulename_Model_Observer</class>
                        <method>myObserverFunction</method>
                    </does_not_matter_what_we_call_this_tag>
                </observers>
            </catalog_category_load_after>
        </events>
    </frontend>

在商店中加载随机类别时的输出将是“嗨,我还是一只猴子”。

答案 1 :(得分:0)

观察者是一个PHP类。

只有约束是您在将事件与事件关联时输入的功能(方法)名称应该在那里。

除此之外,你可以做任何PHP允许的事情。

答案 2 :(得分:0)

您可以在Observer中使用构造函数

请参阅Magento1中的以下Observer类

class Mage_CatalogIndex_Model_Observer extends Mage_Core_Model_Abstract
{
    protected $_parentProductIds = array();
    protected $_productIdsMassupdate = array();

    protected function _construct() {}

class Mage_Rss_Model_Observer
{
    /**
     * Factory instance
     *
     * @var Mage_Core_Model_Abstract
     */
    protected $_factory;

    /**
     * Application instance
     *
     * @var Mage_Core_Model_App
     */
    protected $_app;

    /**
     * @param array $args
     */
    public function __construct(array $args = array())
    {
        $this->_factory = !empty($args['factory']) ? $args['factory'] : Mage::getSingleton('core/factory');
        $this->_app = !empty($args['app']) ? $args['app'] : Mage::app();
    }