Magento的配置系统就像是Magento的心脏,支撑着Magento的运行。这套配置系统掌管着几乎所有“module/model/class/template/etc”。它把整个Magento系统抽象出来,用一个配置文件来描述。这里的“配置文件”并不是一个物理上存在的文件,而是Magento根据当前的系统状态动态生成的一段XML。大多数的PHP开发者并不习惯于这样抽象层,因为它增加的编程的复杂性。但是这样的抽象提供了无与伦比的灵活性,允许你覆盖几乎任何系统的默认行为。

首先,让我们写一个简单的扩展组件来看看这个所谓的“配置文件”长什么样。虽然我已经提供的现成的代码,但是还是建议你自己建立这个插件,把整个流程走一遍有助于你的理解。


1.1设置组件的目录结构
我们要创建一个Magento组件(注:在Magento里组件被叫做Module,也就是模块)。Magento的模块由php和xml文件组成,目的是扩展或者覆盖系统的行为,比如为订单增加数据模型,更改一个类的方法,或者增加一个全新的功能。Magento自带的那些功能也都是基于模块的,比如用户注册,商品展示,结账流程等等。总之,在Magento里一切皆模块。
大多数Magento的系统模块的结构和我们将要构建的组件的结构是一样的。

Magento的系统模块在以下目录:

app/code/core/Mage

每一个子目录都是一个单独的模块。这些模块是由Magento官方开发的。我们安装完Magento以后,所使用的功能就是来自这些模块。

我们自己创建的模块应该放在如下目录:

app/code/local/Packagename

“Packagename”应该是一个唯一的字符串,用来标识你的代码。通常人们使用公司名字作为Packagename,比如:

app/code/local/Infinity

目前我们公司的所有Magento项目,Packagename都必须使用我们的公司名“Infinity”。

我们创建以下目录结构:

app/code/local/Infinity/Configviewer/Block
app/code/local/Infinity/Configviewer/controllers
app/code/local/Infinity/Configviewer/etc
app/code/local/Infinity/Configviewer/Helper
app/code/local/Infinity/Configviewer/Model
app/code/local/Infinity/Configviewer/sql

并不是所有的组件都必须包含以上所有的目录,但是为了以后开发方便,我们还是在一开始就把目录创建好。接下来我们要创建两个文件。

一个是config.xml,放在etc目录下面:

app/code/local/Infinity/Configviewer/etc/config.xml

文件内容如下:

<config><modules><Infinity_Configviewer><version>0.1.0</version></Infinity_Configviewer></modules></config>

第二个文件需要在如下位置创建:

app/etc/modules/Infinity_Configviewer.xml

这个文件应该遵循如下命名规则“Packagename_Modulename.xml”,文件内容如下:

<config><modules><Infinity_Configviewer><active>true</active><codePool>local</codePool></Infinity_Configviewer></modules>
</config>

建立好这两个文件以后,你的模块的骨架就已经完成了。Magento已经知道你的模块存在,但是现在你的模块不会做任何事情。我们来确认一下Magento确实装载了你的模块:
1)清空Magento缓存
2)在后台管理界面,进入 System->Configuration->Advanced
3)展开“Disable Modules Output”
4)确认“Infinity_Configviewer”显示出来了

如果你看到“Infinity_Configviewer”,那么恭喜你,你已经成功创建了你第一个Magento模块!


1.2创建模块逻辑

我们之前创建的模块不会做任何事情,下面我们来为这个模块加入逻辑:
1. 检查“showConfig”查询字符串是否存在
2. 如果“showConfig”存在,那么检查“showConfigFormat”查询字符串是否存在
3. 如果“showConfigFormat”存在,那么输出指定格式的配置信息,否则输出默认格式的配置信息
4. 终止执行流程。

首先更改我们的config.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<config>    <modules><Infinity_Configviewer><version>0.1.0</version></Infinity_Configviewer></modules><global><events ><controller_front_init_routers> <observers>   /*….观察….*/<Infinity_configviewer_model_observer><type>singleton</type>                          <class>Infinity_Configviewer_Model_Observer</class><method>checkForConfigRequest</method></Infinity_configviewer_model_observer></observers></controller_front_init_routers></events></global>
</config>----------------------------------------
<events><event_name><observers><observer_identifier><class>module_name/observer</class><method>function_name</method></observer_identifier></observers></event_name>
</events>

然后创建如下文件:

Infinity/Configviewer/Model/Observer.php

输入以下内容:

<?php
class Infinity_Configviewer_Model_Observer {const FLAG_SHOW_CONFIG = 'showConfig';const FLAG_SHOW_CONFIG_FORMAT = 'showConfigFormat';private $request;public function checkForConfigRequest($observer) {$this->request = $observer->getEvent ()->getData ( 'front' )->getRequest ();if ($this->request->{self::FLAG_SHOW_CONFIG} === 'true') {$this->setHeader ();$this->outputConfig ();}}private function setHeader() {$format = isset ( $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} ) ? $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml';switch ($format) {case 'text' :header ( "Content-Type: text/plain" );break;default :header ( "Content-Type: text/xml" );}}private function outputConfig() {die ( Mage::app ()->getConfig ()->getNode ()->asXML () );}
}
?>

好了,代码编辑结束。清空你的Magento缓存,输入如下URL:

http://magento.example.com/?showConfig=true

【注: 根据文中的配置,不难看出任何指向Magento的URL加了“?showConfig=true”以后,都会输出同样的内容,正常的执行流程会被终止。】


1.3配置文件分析
打开上述URL,你应该看到一个巨大的XML文件。

这个文件描述了当前Magento系统的状态。它列出了所有的模块,数据模型,类,事件,监听器等等。举个例子,如果你搜索如下字符串:Configviewer_Model_Observer,你会发现刚刚你创建的那个类被列出来了。Magento会解析每个模块的config.xml,并把它们包含在这个全局配置中。


1.4配置文件的作用
到目前为止,我们所作的事情似乎没什么意义,但是这个配置文件却是理解Magento的关键因素。你创建的每一个模块都会被加到这个配置文件中,任何时候,你需要调用一个系统功能的时候,Magento都会通过这个配置文件来查询相应的模块和功能。举个简单的例子,如果你懂MVC的话,你应该和“helper class”之类概念的打过交道:

$helper_salesrule = new Mage_SalesRule_Helper();

Magento抽象了PHP的类声明方式。在Magento系统中,上面的代码等同于:

$helper_salesrule = Mage::helper('salesrule');

Magento总是通过配置文件来获得类名,这个逻辑看起来有些复杂,但这样做的优点也很明显,我们可以不需要更改Magento的代码就能更改Magento的核心功能。【注: 在这个例子中,我们可以通过修改配置文件用我们自己的SalesRule_Helper类来替换原来那个】这种高度抽象的编程方式在php中并不常见,但是它可以让你清晰的扩展或者替换系统的某一部分。

1.Magento的配置系统相关推荐

  1. 深入理解Magento – 第一章 – Magento强大的配置系统

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第一章 – Magento强大的配置系统 Magento的配置系统就像是Magento的心脏,支撑着Magento ...

  2. linux内核配置系统浅析(转)

    随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后, ...

  3. Linux内核配置系统浅析

    随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后, ...

  4. 配置系统在开机时启动虚拟机

    2.2  配置系统在开机时启动虚拟机 可以通过两种方式配置系统在开机时自动启动虚拟机.从命令行可以自动启动系统.以下命令只需要一步即可设置,即添加一个到/etc/libvirt/qemu/autost ...

  5. Confluence 6 配置系统属性

    2019独角兽企业重金招聘Python工程师标准>>> 在这个页面中描述 Confluence 启动时如何设置 Java 属性和其他选项. 请查看 How to fix out of ...

  6. Dotnet 2.0配置系统

    今天使用VS2005开发一个Windows服务,发现dotnet2.0的配置系统相对于1.x的功能变化很大.记录下来同各位共享. .NET Framework 1.1 提供一个基本的应用程序配置机制, ...

  7. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]...

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  8. 杨中科.NET5视频教程更新了:DI、配置系统、Logging、EF Core等

    我的.NET5视频教程又更新了一些内容了,包含依赖注入.配置系统.日志系统以及部分Entity Framework Core的内容.Entity Framework Core还没全讲完,会继续更新. ...

  9. C# 读取app.config配置文件 节点键值,提示 配置系统未能初始化 错误的解决方案...

    新建C#项目,在app.config中添加了appSettings项,运行时出现"配置系统未能初始化"的错误,MSDN里写到,如果配置文件中包含 configSections 元素 ...

  10. runtime_mysql_users_proxysql的配置系统

    proxysql的配置系统特点 1 允许轻松自动更新配置.为此,有一个MySQL兼容的管理界面 2 允许在运行时修改尽可能多的配置项,而无需重新启动守护程序 3 允许轻松回滚错误的配置 这是使用多层配 ...

最新文章

  1. Microbiome:宏基因组揭示冻土带、温带草原和热带土壤抗性的特征
  2. 5G时代,工业互联网安全挑战远超消费互联网
  3. Uncode系列开源组件简介
  4. linux下添加用户并赋予root权限
  5. Qt 读写XML文件
  6. Leetcode unique-paths
  7. AI如何用特征、权重和避免过拟合等技术来分辨冬瓜和西瓜?
  8. 基于TableStore的海量电商订单元数据管理
  9. (进阶篇)Redis6.2.0 集群 主从复制_原理剖析_02
  10. RapidMiner tuts
  11. Linux管理员常用网络资源(收集帖)
  12. 动力节点老杜mysql文件_MySQL/InnoDB数据克隆插件(clone plugin)实现剖析
  13. 第13章 集成学习和随机森林 学习笔记中 oob
  14. 网页游戏用的什么编程语言
  15. 并联串联混合的电压和电流_串联谐振和并联谐振的区别
  16. 360全景倒车影像怎么看_最近淘了一个360度全景倒车影像-4路行车记录仪监控录像,和大家分享一下...
  17. 淘宝API upload_img - 上传图片到淘宝
  18. 风水大师 or 企业医生?张明明谈数据分析师的职业之路
  19. Ajax: 一个建立Web应用的新途径 [转]
  20. 选SSD就是选闪存颗粒!全面解析原片/白片/黑片

热门文章

  1. ps 命令的详细功能解析
  2. MongoDB小结07 - update【$pop】
  3. 桑心啊,ListT.FindAll()的效率竟然比for循环还差。
  4. 一文带你彻底理解ROC曲线和AUC值
  5. 推荐几个学霸级的技术公众号陪你过暑假
  6. Math类的常用方法和静态导入.
  7. C语言中指针数组和数组指针
  8. Hello 博客园! ---致我人生中的第一篇随笔
  9. 得到控制台窗口的句柄
  10. IE下检测泄露的全局变量