我无法理解观察者和模型之间的区别。他们真的是一回事吗?
例如,我有一个导出订单的模型。我有一个监听器监听事件(比如下单),然后控制器中有代码调用导出订单模型。
现在,我有一个控制器,我想执行相同的功能(根据传递的请求导出订单)。
我可以简单地创建一个观察者的实例(它已经有一个调用导出模型的方法),还是我需要再次创建代码来创建模型?
我无法理解观察者和模型之间的区别。他们真的是一回事吗?
例如,我有一个导出订单的模型。我有一个监听器监听事件(比如下单),然后控制器中有代码调用导出订单模型。
现在,我有一个控制器,我想执行相同的功能(根据传递的请求导出订单)。
我可以简单地创建一个观察者的实例(它已经有一个调用导出模型的方法),还是我需要再次创建代码来创建模型?
模型由实际模式组成。[数据和字段]。
从你的上下文
我有一个监听事件(例如下订单)的观察者
任何监听事件等的东西都是“控制器”的角色。因此,模型与观察者完全不同。
模型扩展(另一个模型类)或(抽象类 Mage_Core_Model_Abstract),因此它具有从该基类共享、扩展和实现的基类和方法。
Magento 中的 Models 通常与数据库表相关联,它通过 Resources 和 Collection 实现 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>
观察者可以是独立的类或扩展其他类以共享其中的一些方法或任何其他可能的目的。
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 链接和谷歌一些教程)
根据您想要从控制器访问观察者的评论,您可以通过不同的方式执行此操作
您可以将观察者写入Extend(Mage_Core_Model_Abstract){您需要在模块的config.xml中定义模块模型部分},然后您就可以像普通模型一样访问观察者Mage::getModel('modulename/modelname');
将观察者编写为模块中的普通 php 类(例如:Package_Module_Model_Observer),然后您始终可以使用“new”运算符来实例化它 $class = new Package_Module_Model_Observer()
当模型的状态发生变化时,模型会通知其关联的视图和控制器。模型是业务逻辑。模型管理应用程序域的行为和数据,响应有关其状态信息的请求(通常来自视图),并响应更改状态的指令(通常来自控制器)。观察者是获取这些通知并对其进行更新/反应的东西。
观察者是控制器。它监听一个指定的事件,当这个事件被触发时,观察者告诉模型该做什么。模型处理数据,控制器告诉如何处理数据。
在您的情况下,我认为您不会创建观察者的实例,而是创建一个控制器并使用现有的导出模型。
Magento 中的 Model View Controller 实现有点随意。在 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/