深入了解Magento-1强大的配置

2015年10月8日 Edited 2022年12月6日 浏览量 24 3 min read
深入了解Magento-1强大的配置

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

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

设置插件的目录结构
我们将要创建一个Magento的模块。Magento的模块由php和xml文件组成,目的是扩展或者覆盖系统的行为,比如为订单增加数据模型,更改一个类的方法,或者增加一个全新的功能。

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

每一个子目录都是一个单独的模块。这些模块是由Magento官方开发的。我们安装完Magento以后,所使用的功能就是来自这些模块。我们自己创建的模块应该放在如下目录
app/code/local/Packagename
“Packagename”应该是一个唯一的字符串,用来标识你的代码。通常人们使用公司名字作为Packagename,比如 app/code/local/Microsoft

由于我在做我自己的Magento项目,我将使用我自己的域名“Magease”。
然后,我们要创建以下目录结构
app/code/local/Magease/Configviewer/Block
app/code/local/Magease/Configviewer/controllers
app/code/local/Magease/Configviewer/etc
app/code/local/Magease/Configviewer/Helper
app/code/local/Magease/Configviewer/Model
app/code/local/Magease/Configviewer/sql
你的插件并不一定需要包含以上所有的目录,但是为了以后开发方便,我们还是在一开始就把目录创建好。接下来我们要创建两个文件,一个是config.xml,放在etc目录下面
app/code/local/Magease/Configviewer/etc/config.xml
文件内容如下

	
		<  config  >     
		    < modules >  
		        < Magease_Configviewer >  
		            < version  >0.1.0<  /version >  
		        < /Magease_Configviewer >  
		    < /modules >  
		<  /config  >  
	


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

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


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

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

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

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

	
		< config >  
		    < modules >...< /modules >  
		    < global >  
		        < events >  
		            < controller_front_init_routers >  
		                < observers >  
		                    < Magease_configviewer_model_observer >  
		                        < type >singleton< /type >                           
		                        < class >Magease_Configviewer_Model_Observer< /class >  
		                        < method >checkForConfigRequest< /method >  
		                    < /Magease_configviewer_model_observer >  
		                < /observers >  
		            < /controller_front_init_routers >  
		        < /events >  
		    < /global >  
		< /config >
	



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

	
		< ?php  
		    class Magease_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


配置文件分析
打开上述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的核心功能。这种高度抽象的编程方式在php中并不常见,但 是它可以让你清晰的扩展或者替换系统的某一部分。

Previous article:
Next article:
Comments
发表评论,留下你的足迹
我们不会公开你的邮箱地址

是否允许我们在发布新内容或者进行促销活动向您发送消息?

Remind me later

Thank you! Please check your email inbox to confirm.

Oops! Notifications are disabled.

© 2014-2023 www.magease.com. All Rights Reserved. 寰云网络 版权所有    鲁ICP备 14014975号-1