深入理解Magento

作者:Alan Storm
翻译:Hailong Zhang

第一章 – Magento强大的配置系统

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

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

设置插件的目录结构

我们将要创建一个Magento的模块【译者注: Magento的插件不叫plug-in,叫module,翻译成模块】。Magento的模块由php和xml文件组成,目的是扩展或者覆盖系统的行 为,比如为订单增加数据模型,更改一个类的方法,或者增加一个全新的功能。【译者注:Magento自带的那些功能也都是基于模块的,比如用户注册,商品 展示,结账流程等等。Magento给我的感觉就是一切皆模块,和Eclipse的插件体系结构有点像】

大多数Magento的系统模块的结构和我们将要构建的插件的结构是一样的。Magento的系统模块在以下目录
app/code/core/Mage

每一个子目录都是一个单独的模块。这些模块是由Magento官方开发的。我们安装完Magento以后,所使用的功能就是来自这些模块。我们自己创建的模块应该放在如下目录
app/code/local/Packagename

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

由于我在做我自己的Magento项目,我将使用我自己的域名“Alanstormdotcom”。 然后,我们要创建以下目录结构

app/code/local/Alanstormdotcom/Configviewer/Block

app/code/local/Alanstormdotcom/Configviewer/controllers

app/code/local/Alanstormdotcom/Configviewer/etc

app/code/local/Alanstormdotcom/Configviewer/Helper

app/code/local/Alanstormdotcom/Configviewer/Model

app/code/local/Alanstormdotcom/Configviewer/sql

你的插件并不一定需要包含以上所有的目录,但是为了以后开发方便,我们还是在一开始就把目录创建好。接下来我们要创建两个文件,一个是config.xml,放在etc目录下面 app/code/local/Alanstormdotcom/Configviewer/etc/config.xml 文件内容如下

<config>   <modules><Alanstormdotcom_Configviewer><version>0.1.0</version></Alanstormdotcom_Configviewer></modules>
</config>

第二个文件需要在如下位置创建 app/etc/modules/Alanstormdotcom_Configviewer.xml 第二个文件应该遵循如下命名规则“Packagename_Modulename.xml”,文件内容如下

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

我们先不管这些文件是干什么的,以后会解释。建立好这两个文件以后,你的模块的骨架就已经完成了。Magento已经知道你的模块存在,但是现在你的模块不会做任何事情。我们来确认一下Magento确实装载了你的模块

  1. 清空Magento缓存
  2. 在后台管理界面,进入 System->Configuration->Advanced
  3. 展开“Disable Modules Output”
  4. 确认“Alanstormdotcom_Configviewer”显示出来了

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

创建模块逻辑

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

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

<config><modules>...</modules><global><events><controller_front_init_routers><observers><alanstormdotcom_configviewer_model_observer><type>singleton</type>                         <class>Alanstormdotcom_Configviewer_Model_Observer</class><method>checkForConfigRequest</method></alanstormdotcom_configviewer_model_observer></observers></controller_front_init_routers></events></global>
</config>

然后创建如下文件 Alanstormdotcom/Configviewer/Model/Observer.php 输入以下内容

<?phpclass Alanstormdotcom_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”以后,都会输出同样的内容,正常的执行流程会被终止。】

配置文件分析

打开上述URL,你应该看到一个巨大的XML文件。这个文件描述了当前Magento系统的状态。它列出了所有的模块,数据模型,类,事件,监听器等等。举个例子,如果你搜索如下字符串
Configviewer_Model_Observer

你会发现刚刚你创建的那个类被列出来了。Magento会解析每个模块的config.xml,并把它们包含在这个全局配置中。

这个配置文件有啥用?

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

$helper_salesrule = new Mage_SalesRule_Helper();

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

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

Magento将通过以下逻辑来处理这行代码

  1. 在配置文件中查找<helpers />标签
  2. 在<helpers />里面查找 <salesrule />标签
  3. 在<sales />里面查找 <class />标签
  4. 实例化从#3找到的类(Mage_SalesRule_Helper)

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

from: http://www.zhlmmc.com/?p=578

深入理解Magento – 第一章 – Magento强大的配置系统相关推荐

  1. 《网络安全工程师笔记》 第一章:虚拟化架构与系统部署

    注:本笔记来自温晓飞老师的网络安全课程 第一章:虚拟化架构与系统部署 第一章:虚拟化架构与系统部署 第二章:IP地址详解 第三章:进制转换 第四章:DOS基本命令与批处理 第五章:用户与组管理 第六章 ...

  2. 第一章 stm32 cubemx基础配置实验以及proteus 8的使用

    第一章 stm32 cubemx基础配置实验以及proteus 8的使用 文章目录 第一章 stm32 cubemx基础配置实验以及proteus 8的使用 前言 一.STM32 Cubemx基础配置 ...

  3. 深入理解Magento – 第二章 – Magento请求分发与控制器

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第二章 – Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图- ...

  4. 学习编程第一章 `大数据应用` linux系统jdk安装

    学习编程第三章 大数据应用 linux系统jdk安装 下载jdk 下载网址: https://www.oracle.com/technetwork/java/javase/downloads/java ...

  5. 读深入理解计算机系统 - 第一章 计算机系统漫游 - 1.1 信息 = 位 + 上下文

    1.1 信息 = 位 + 上下文 先说一下位,计算机的最小单位,一个位可以取两个值1/0(高电平/低电平)代表两种状态(1个位=1bit). 但是世界事物千千万,无法用一个位来表示,怎么办呢? 某不知 ...

  6. 离散信号处理的基本概念理解(第一章 离散序列和离散系统(全))

    文章目录 1.对离散信号的意识 2.数字信号处理的基本符号 3.LTI系统(线性非时变系统) 4. 分析LTI系统 1.对离散信号的意识 首先,我们知道离散信号是通过ADC通过采样得来的,如果我们不知 ...

  7. 《python3网络爬虫开发实战》第一章、开发环境配置-问题汇总

    开发环境: VMware虚拟机 Ubuntu18.04 python3.6 (由于对vi操作水平有限,所以大部分都用的gedit进行文件编辑) 换源: 刚装上系统后换了好几个源,就清华源感觉好使点,别 ...

  8. 第一章:1.2.2系统分类(二)

    可逆与不可逆系统 如图所示,可逆系统的定义与可逆函数的定义完全类似.具有反函数的函数是可逆函数.如果一个系统可以写成可逆函数的形式,那么这个系统是可逆系统 像y=x^3 是可逆系统,y=x^2就是不可 ...

  9. 第一章:1.2.2系统分类(一)

    系统的分类多种多样,我们在这里主要研究的是线性时不变系统 下面我们分别进行介绍 即时系统与动态系统 相比于即是系统,动态系统有更强的信号抗干扰能力 对于动态系统而言,他的当前时刻输出是和以前的输入有着 ...

最新文章

  1. 482. License Key Formatting
  2. 01背包 + 概率 之 hdu 2955
  3. 怎么把照片做成立方体在html播放,立方体照片.html
  4. 【AI不惑境】学习率和batchsize如何影响模型的性能?
  5. IIS 支持 php
  6. php 时分秒选择联动,微信小程序-年月日时分秒六级联动时间选择器
  7. 通过UIBezierPath贝塞尔曲线画圆形、椭圆、矩形
  8. struts2+spring 项目中配置tiles的解决方案
  9. Android 自定义 View
  10. 如何在mysql下实现事务的提交与回滚
  11. 全志A31S源码编译
  12. matlab车牌自动定位,超级实用的车牌定位matlab程序
  13. uniapp 苹果安全区配置
  14. html中将scss转编译为css,SASS把scss转化为css的四种转化方式与命令
  15. 使用CSS Flexbox 构建可靠实用的网站 Header
  16. 2018,AI旗舰启程出发!自动化所全球AI邀请函
  17. python csv文件和xlsx文件混杂时,提取指定列数据并合并
  18. 如何将高效设计应用于 DAO?
  19. 13-反向传播法求梯度
  20. latex中文编号是问号的问题

热门文章

  1. 车厢重组(信息学奥赛一本通-T1310)
  2. 三连击(升级版)(洛谷-P1618)
  3. 47 CO配置-控制-利润中心会计-设置实际数据的控制参数
  4. C语言 sprintf实现
  5. 域服务器批量修改用户密码,Windows域控制器批量创建用户
  6. 【Pytorch】model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别
  7. 训练(training)和推理\推断(inference)的关系?
  8. ROS学习—opencv使用之图片传输
  9. mui 组件:“div下拉导航”【scroll固定位置】- 案例篇
  10. GitHubamp;gitee图床网站源码