【问题标题】:Difference between Model and Observer模型和观察者之间的区别
【发布时间】:2013-05-27 06:06:33
【问题描述】:

我无法理解观察者和模型之间的区别。 它们真的是一回事吗?

例如,我有一个导出订单的模型。我有一个监听器监听事件(比如下单),然后控制器中有代码调用导出订单模型。

现在,我有一个控制器,我想执行相同的功能(根据传递的请求导出订单)。

我可以简单地创建一个观察者的实例(它已经有一个调用导出模型的方法),还是我需要再次创建代码来创建模型?

【问题讨论】:

    标签: php magento model-view-controller


    【解决方案1】:

    就定义而言:-

    在 Magento 中的使用方面

    • 型号

      • 模型扩展(另一个模型类)或(抽象类 Mage_Core_Model_Abstract),因此它具有从该基类共享、扩展和实现的基类和方法。

      • Magento 中的模型通常与数据库表相关联,它通过资源和集合实现 ORM

      • XML 声明:

      --

      <global>
      ..............
      <models>
          <modulename>
              <class>Package_Modulename_Model</class>
              <resourceModel>Modulename_resource</resourceModel>
          </modulename>
          <modulename_resource>
              <class>Package_Modulename_Model_Mysql4</class>
              <deprecatedNode>package_modulename_mysql4</deprecatedNode>
              <entities>
                  <modulename> 
                      <table>db_table</table>
                  </modulename>
              </entities>
          </modulename_resource>
      </models>
      ........
      </global>
      
    • 观察者

      • Observer 是普通类,它们实现了一些方法来监视脚本执行期间发生的已定义事件,并执行此方法(函数)中定义的指令。
      • 观察者可以是独立的类,也可以扩展其他类以共享其中的一些方法或任何其他可能的目的。

      • XML声明:在magento中不需要声明Observer,只需要指定类名和方法,根据调度的事件触发即可。

      --

      <events>
          <sales_quote_save_after>
              <observers>
                  <observer_unique_name>
                      <type>model</type>
                      <class>Package_Modulename_Model_Observer</class>
                      <method>quoteSaveAfter</method>
                  </observer_unique_name>
              </observers>
          </sales_quote_save_after>
      </events>
      

    以上信息非常简短,但它展示了观察者和模型之间的基本区别。

    您需要阅读并练习在不同用例的 magento 中使用它,以便能够区分两者(查看 wiki 链接和谷歌一些教程)


    根据你想要从控制器访问观察者的评论,你可以通过不同的方式来做到这一点

      1234563 /p>
    • 在模块中将观察者编写为普通的php类(例如:Package_Module_Model_Observer),然后您可以随时使用“new”运算符对其进行实例化$class = new Package_Module_Model_Observer()

    【讨论】:

    • 谢谢,这是一个很好的解释。所以就我而言,我想要一些调用模型的方法。观察者应该能够访问此方法(因为事件会触发它),但控制器也应该能够访问这些方法。最好的方法是组织我的代码,以便我只需要指定这些方法?这些方法实际上是实例化模型等的 4 行代码。
    【解决方案2】:

    模型由实际架构组成。 [数据和字段]。

    根据您的上下文

    我有一个监听器来监听事件(例如下订单)

    任何监听事件等的东西都是“控制器”的角色。 因此,模型与观察者的模型完全不同

    【讨论】:

      【解决方案3】:

      当状态发生变化时,模型会通知其关联的视图和控制器。模型是业务逻辑。模型管理应用程序域的行为和数据,响应有关其状态信息的请求(通常来自视图),并响应更改状态的指令(通常来自控制器)。 观察者是获取这些通知并对其进行更新/反应的东西。

      【讨论】:

        【解决方案4】:

        观察者是控制器。它监听一个指定的事件,当这个事件被触发时,观察者告诉模型该做什么。模型处理数据,控制器告诉如何处理数据。

        在您的情况下,我认为您不会创建观察者的实例,而是创建一个控制器并使用现有的导出模型。

        【讨论】:

          【解决方案5】:

          Magento 中的模型视图控制器的实现有点随意。在 Magento 中,观察者只是一个模型,它有一个带有特定参数的公共方法,该参数保存从事件传递的数据,所以是的,它们是同一回事。您可以只创建一个实例并调用相同的方法,但您必须传递传递给事件的相同数据。

          例如:在事件sales_order_place_after 中传递订单对象。你可以这样做:

          $observer = Mage::getModel(‘yourmodule/observer’);
          
          $observerData->setOrder($order);
          
          $observerData = new Varien_Object();
          
          $observer->exportOrder($observerData);
          

          您将在此处找到有关该问题的更多详细信息。此链接还为您提供 Andreas von Studnitz 和 Nikolai Krambrock 博士在 Meet Magento DE 2014 上关于代码质量的演示视频:http://www.code4business.de/code-qualitaet-magento/

          【讨论】:

            猜你喜欢
            • 2017-09-02
            • 2016-09-29
            • 1970-01-01
            • 2013-03-13
            • 2017-06-16
            • 2015-02-24
            • 2021-07-09
            • 2011-09-20
            • 1970-01-01
            相关资源
            最近更新 更多