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项目,我将使用我自己的项目名“App”。 然后,我们要创建以下目录结构
app/code/local/App/Configviewer/Block
app/code/local/App/Configviewer/controllers
app/code/local/App/Configviewer/etc
app/code/local/App/Configviewer/Helper
app/code/local/App/Configviewer/Model
app/code/local/App/Configviewer/sql
你的插件并不一定需要包含以上所有的目录,但是为了以后开发方便,我们还是在一开始就把目录创建好。接下来我们要创建两个文件,一个是config.xml,放在etc目录下面
app/code/local/App/Configviewer/etc/config.xml
文件内容如下
<config>
<modules>
<App_Configviewer>
<version>0.1.0</version>
</App_Configviewer>
</modules>
</config>
第二个文件需要在如下位置创建
app/etc/modules/App_Configviewer.xml
第二个文件应该遵循如下命名规则“Packagename_Modulename.xml”,文件内容如下
<config>
<modules>
<App_Configviewer>
<active>true</active>
<codePool>local</codePool>
</App_Configviewer>
</modules>
</config>
我们先不管这些文件是干什么的,以后会解释。建立好这两个文件以后,你的模块的骨架就已经完成了。Magento已经知道你的模块存在,但是现在你的模块不会做任何事情。我们来确认一下Magento确实装载了你的模块
1. 清空Magento缓存
2. 在后台管理界面,进入 System->Configuration->Advanced
3. 展开“Disable Modules Output”
4. 确认“App_Configviewer”显示出来了
如果你看到“App_Configviewer”,那么恭喜你,你已经成功创建了你第一个Magento模块!
创建模块逻辑
我们之前创建的模块不会做任何事情,下面我们来为这个模块加入逻辑
1. 检查“showConfig”查询字符串是否存在
2. 如果“showConfig”存在,那么检查“showConfigFormat”查询字符串是否存在
3. 如果“showConfigFormat”存在,那么输出指定格式的配置信息,否则输出默认格式的配置信息
4. 终止执行流程
首先更改我们的config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<App_Configviewer>
<version>0.1.0</version>
</App_Configviewer>
</modules>
<global>
<events>
<controller_front_init_routers>
<observers>
<app_configviewer_model_observer>
<type>singleton</type>
<class>App_Configviewer_Model_Observer</class>
<method>checkForConfigRequest</method>
</app_configviewer_model_observer>
</observers>
</controller_front_init_routers>
</events>
</global>
</config>
然后创建如下文件
App/Configviewer/Model/Observer.php
输入以下内容
<?php
class App_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
1
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. 在配置文件中查找标签
2. 在里面查找 标签
3. 在里面查找 标签
4. 实例化从#3找到的类(Mage_SalesRule_Helper)
Magento总是通过配置文件来获得类名,这个逻辑看起来有些复杂,但这样做的优点也很明显,我们可以不需要更改Magento的代码就能更改Magento的核心功能。【注: 在这个例子中,我们可以通过修改配置文件用我们自己的SalesRule_Helper类来替换原来那个】这种高度抽象的编程方式在php中并不常见,但是它可以让你清晰的扩展或者替换系统的某一部分。
Magento强大的配置系统的更多相关文章
- 深入理解Magento - 第一章 - Magento强大的配置系统
深入理解Magento 作者:Alan Storm翻译:zhlmmc 前言第一章 - Magento强大的配置系统第二章 - Magento请求分发与控制器第三章 - 布局,块和模板第四章 - 模型和 ...
- SuperSocket源码解析之配置系统
一 继承Net配置系统 Net应用程序配置机制跟程序集引用大致类似,均具有继承性,如iis几乎每个应用程序都会有一个Web.config,比如我们使用vs2012以上版本创建一个web应用程序会自带一 ...
- Lichee (五岁以下儿童) sysconfig1.fex 配置系统
sysconfig配置系统,作为一个通用的软件平台,还希望通过它.能够适应用户不同的方案.通过给出一个相应的配置.用户的方案就能够自己主动执行,而不须要改动系统里面的代码,或者又一次给出參数. 一. ...
- MySQL中间件之ProxySQL(4):多层配置系统
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL中的库 使用ProxySQL的Admin管理接口连 ...
- Lichee (五) sysconfig1.fex 配置系统
sysconfig配置系统,作为一个通用的软件平台,还希望通过它,可以适应用户不同的方案.通过给出一个对应的配置,用户的方案就可以自动运行,而不需要修改系统里面的代码,或者重新给出参数. 配置脚本的本 ...
- Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM
web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单 ...
- ProxySQL(4):多层配置系统
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9280793.html ProxySQL中的库 使用ProxySQL的Admin管理接口连上ProxySQL, ...
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
随机推荐
- apache开源项目--hadoop
Hadoop 是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Had ...
- HTML5,CSS3 与 Javascript 制作视频播放器
早一段时间,有一直研究 HTML5 和 CSS3 ,自己也做了不少 Demo ,只是 HTML5 Video 和 Audio 由于自己平时比较喜欢留意不同的播放器,因此特别想做一个自己喜欢的设计,考虑 ...
- 微支付开发(.net)
最近一周多进行微支付开发工作,总结一下关于微支付开发中遇到的问题. 如写得不对请大家提出,第一次自己写文章.嘿嘿... 1.申请微支付,登陆公众平台后(公众号为服务号并已认证),进入“服务”-“服务中 ...
- C#读取设置Cookie
设置: HttpCookie cookie = new HttpCookie("cookieName"); cookie.Value = "name1" Htt ...
- Android 开发性能优化之SparseArray(二)
一.SparseIntArray API SparseIntArrays map integers to integers. Unlike a normal array of integers, t ...
- Android图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- 转载--C++ STL
转自:http://wenku.baidu.com/view/15d18b4533687e21af45a9a4.html 1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec ...
- CodeForces 287B Pipeline
思路:二分答案,时间复杂度O(nlgn). 若个数为x,那么算出这种情况下提供的水管的最大值和最小值与n比较即可,注意x个分离器需要减去x-1个水管. #include<cstdio> # ...
- BestCoder Round #81 (div.2) B Matrix
B题...水题,记录当前行是由原矩阵哪行变来的. #include<cstdio> #include<cstring> #include<cstdlib> #inc ...
- bss 概念
BSS段 在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS ...