深入理解Magento – 第一章 – Magento强大的配置系统
深入理解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确实装载了你的模块
- 清空Magento缓存
- 在后台管理界面,进入 System->Configuration->Advanced
- 展开“Disable Modules Output”
- 确认“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将通过以下逻辑来处理这行代码
- 在配置文件中查找<helpers />标签
- 在<helpers />里面查找 <salesrule />标签
- 在<sales />里面查找 <class />标签
- 实例化从#3找到的类(Mage_SalesRule_Helper)
Magento总是通过配置文件来获得类名,这个逻辑看起来有些复杂,但这样做的优点也很明显,我们可以不需要更改Magento的代码就能更改 Magento的核心功能。【译者注: 在这个例子中,我们可以通过修改配置文件用我们自己的SalesRule_Helper类来替换原来那个】这种高度抽象的编程方式在php中并不常见,但 是它可以让你清晰的扩展或者替换系统的某一部分。
from: http://www.zhlmmc.com/?p=578
深入理解Magento – 第一章 – Magento强大的配置系统相关推荐
- 《网络安全工程师笔记》 第一章:虚拟化架构与系统部署
注:本笔记来自温晓飞老师的网络安全课程 第一章:虚拟化架构与系统部署 第一章:虚拟化架构与系统部署 第二章:IP地址详解 第三章:进制转换 第四章:DOS基本命令与批处理 第五章:用户与组管理 第六章 ...
- 第一章 stm32 cubemx基础配置实验以及proteus 8的使用
第一章 stm32 cubemx基础配置实验以及proteus 8的使用 文章目录 第一章 stm32 cubemx基础配置实验以及proteus 8的使用 前言 一.STM32 Cubemx基础配置 ...
- 深入理解Magento – 第二章 – Magento请求分发与控制器
深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第二章 – Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图- ...
- 学习编程第一章 `大数据应用` linux系统jdk安装
学习编程第三章 大数据应用 linux系统jdk安装 下载jdk 下载网址: https://www.oracle.com/technetwork/java/javase/downloads/java ...
- 读深入理解计算机系统 - 第一章 计算机系统漫游 - 1.1 信息 = 位 + 上下文
1.1 信息 = 位 + 上下文 先说一下位,计算机的最小单位,一个位可以取两个值1/0(高电平/低电平)代表两种状态(1个位=1bit). 但是世界事物千千万,无法用一个位来表示,怎么办呢? 某不知 ...
- 离散信号处理的基本概念理解(第一章 离散序列和离散系统(全))
文章目录 1.对离散信号的意识 2.数字信号处理的基本符号 3.LTI系统(线性非时变系统) 4. 分析LTI系统 1.对离散信号的意识 首先,我们知道离散信号是通过ADC通过采样得来的,如果我们不知 ...
- 《python3网络爬虫开发实战》第一章、开发环境配置-问题汇总
开发环境: VMware虚拟机 Ubuntu18.04 python3.6 (由于对vi操作水平有限,所以大部分都用的gedit进行文件编辑) 换源: 刚装上系统后换了好几个源,就清华源感觉好使点,别 ...
- 第一章:1.2.2系统分类(二)
可逆与不可逆系统 如图所示,可逆系统的定义与可逆函数的定义完全类似.具有反函数的函数是可逆函数.如果一个系统可以写成可逆函数的形式,那么这个系统是可逆系统 像y=x^3 是可逆系统,y=x^2就是不可 ...
- 第一章:1.2.2系统分类(一)
系统的分类多种多样,我们在这里主要研究的是线性时不变系统 下面我们分别进行介绍 即时系统与动态系统 相比于即是系统,动态系统有更强的信号抗干扰能力 对于动态系统而言,他的当前时刻输出是和以前的输入有着 ...
最新文章
- 482. License Key Formatting
- 01背包 + 概率 之 hdu 2955
- 怎么把照片做成立方体在html播放,立方体照片.html
- 【AI不惑境】学习率和batchsize如何影响模型的性能?
- IIS 支持 php
- php 时分秒选择联动,微信小程序-年月日时分秒六级联动时间选择器
- 通过UIBezierPath贝塞尔曲线画圆形、椭圆、矩形
- struts2+spring 项目中配置tiles的解决方案
- Android 自定义 View
- 如何在mysql下实现事务的提交与回滚
- 全志A31S源码编译
- matlab车牌自动定位,超级实用的车牌定位matlab程序
- uniapp 苹果安全区配置
- html中将scss转编译为css,SASS把scss转化为css的四种转化方式与命令
- 使用CSS Flexbox 构建可靠实用的网站 Header
- 2018,AI旗舰启程出发!自动化所全球AI邀请函
- python csv文件和xlsx文件混杂时,提取指定列数据并合并
- 如何将高效设计应用于 DAO?
- 13-反向传播法求梯度
- latex中文编号是问号的问题
热门文章
- 车厢重组(信息学奥赛一本通-T1310)
- 三连击(升级版)(洛谷-P1618)
- 47 CO配置-控制-利润中心会计-设置实际数据的控制参数
- C语言 sprintf实现
- 域服务器批量修改用户密码,Windows域控制器批量创建用户
- 【Pytorch】model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别
- 训练(training)和推理\推断(inference)的关系?
- ROS学习—opencv使用之图片传输
- mui 组件:“div下拉导航”【scroll固定位置】- 案例篇
- GitHubamp;gitee图床网站源码