“约定优于配置”与Magento改造尝试四之block、helper和model载入

暂定本章为这个系列最后一章,还是继续沿用模块的别名(alias)概念

    <modules>
        <Mage_Wishlist>
            <version>1.6.0.0</version>
            <alias>wishlist</alias>
        </Mage_Wishlist>
    </modules>

看下Magento通常是怎么定义block、helper和model的别名的

<blocks>
            <wishlist>
                <class>Mage_Wishlist_Block</class>
            </wishlist>
        </blocks>
        <models>
            <wishlist>
                <class>Mage_Wishlist_Model</class>
                ......
            </wishlist>
            ......
        </models>

类似于一样前两章所说。blocks和models的别名都是一样的。当然本章改造目的就是通用别名代替上面这样的分别单独配置了。只是这里要先等下,由于我在Mage_Wishlist的config.xml里没有发现对helpers的定义,而Mage_Wishlist的helper类明明都能够正常使用的。为什么呢?

这个系列一開始(“约定优于配置”与Magento)我吐槽了下说Magento是多么的违反“约定优于配置”的范式,这里小小的平反下,Magento还是有地方符合这个范式的。上面讲到为什么没有对helpers进行定义,模块的helper类依旧能够正常使用。原因看Mage_Core_Model_Config类的public
function getGroupedClassName方法

// Second - if entity is not rewritten then use class prefix to form class name
        if (empty($className)) {
            if (!empty($config)) {
                $className = $config->getClassName();
            }
            if (empty($className)) {
                $modules = $this->getAliasConfig();
                if($modules[$group]){
                    $className = $modules[$group].'_'.$groupType;
                }
            }
            if (empty($className)) {
                $className = 'mage_'.$group.'_'.$groupType;
            }
            if (!empty($class)) {
                $className .= '_'.$class;
            }
            $className = uc_words($className);
        }

有一段$className = ‘mage_‘.$group.‘_‘.$groupType;。意思是当没有在config.xml里指定别名时。自己主动依据$group名去Mage文件夹下寻找相应的helper类,以Mage::helper(‘wishlist‘)->calculate();这样的写法为例,这里$group是helper后面括号中的wishlist,这里的$groupType是helper。那么拼接之后的$className就是“mage_wishlist_helper”,就是通过这样的方式,系统提供了一种在未明白定义情况下helper类的一个默认载入路径。

这套逻辑不只对helper类适用,对block和model类一样适用。由于getGroupedClassName是一个block、helper和model共用的方法,详见Mage_Core_Model_Config类里的

public function getBlockClassName($blockType){
    ......
}
public function getHelperClassName($helperName){
    ......
}
public function getModelClassName($modelClass){
    ......
}

所以理论上来说,未对这块代码做改动的情况下。就已经能够把原生模块(core/Mage文件夹下的)的config.xml做一些精简了。比方删掉Mage_Wishlist模块的以下这段配置,并不会对这个模块的正常使用带来不论什么影响

<blocks>
            <wishlist>
                <class>Mage_Wishlist_Block</class>
            </wishlist>
        </blocks>

当然Magento官方保留这些配置也不是没有道理,上面提到了说这个默认载入方式仅仅对core/Mage文件夹下的的模块有效,community和local文件夹下的模块都是不符合标准的,必须显式指定配置。假设自带核心模块都把这些配置省了,那用户做二次开发就没參照物了

Magento是一个扩展性相当好的系统,引入各种第三方插件或者自己二次开发功能模块都是非经常见的场景,前面提到原生的“约定”仅仅对core/Mage有效,那么本章要做的改动就是让全部community和local文件夹下的模块在载入block、helper和model时也能够依照某种约定(就是我所定义的模块的别名)来进行,免去显示配置的xml内容。

改动的方法就是之前提到的public function getGroupedClassName,我增加了以下这样一段代码

            if (empty($className)) {
                $modules = $this->getAliasConfig();
                if($modules[$group]){
                    $className = $modules[$group].'_'.$groupType;
                }
            }

详见:https://github.com/walexer/Yli_Coc/blob/master/app/code/local/Mage/Core/Model/Config.php

原理就是用模块的别名(alias)取代显式各自指定的别名,由于核心模块有自己的一套“约定”。我用一个第三方插件模块AW_Blog来说明

定义别名:

    <modules>
        <AW_Blog>
            <version>1.3.16</version><platform>ce</platform>
            <alias>blog</alias>
        </AW_Blog>
    </modules>

能够删除的配置内容

        <helpers>
            <blog>
                <class>AW_Blog_Helper</class>
            </blog>
        </helpers>

<blocks>里面的

            <blog>
                <class>AW_Blog_Block</class>
            </blog>

<models>里面的

<class>AW_Blog_Model</class>

本系列的改造到这里临时告一段落,相信依照“约定优于配置”的原则,Magento肯定还有地方能够拎出来改一改(毕竟Magento那么的自由),以后有时间的话能够考虑是不是开续集。

下一章会做一下改造前后的性能对照測试。有明显提升的话当然最好,没有明显提升的话就当玩票了,最起码读了不少Magento的底层源代码,总是有收获的。

时间: 2024-10-20 19:16:55

“约定优于配置”与Magento改造尝试四之block、helper和model载入的相关文章

SpringMVC介绍之约定优于配置

转自:http://haohaoxuexi.iteye.com/blog/1774603 所谓的约定优于配置就是指在程序开发过程中我们约定好一些规则可以使我们更少的进行配置和代码编写.就这么简单的一句话可能你还不是很懂什么是约定优于配置,没关系,看完后面对SpringMVC的约定优于配置的介绍之后你就会明白了. SpringMVC对约定优于配置的支持主要表现在三个方面,Model.View和Controller. Model:SpringMVC对Model的约定优于配置的支持是基于ModelMa

Maven之(八)约定优于配置

maven的配置文件看似很复杂,其实只需要根据项目的实际背景,设置个别的几个配置项而已.maven有自己的一套默认配置,使用者除非必要,并不需要去修改那些约定内容.这就是所谓的"约定优于配置". 文件目录 maven默认的文件存放结构如下: 每一个阶段的任务都知道怎么正确完成自己的工作,比如compile任务就知道从src/main/Java下编译所有的java文件,并把它的输出class文件存放到target/classes中. 对maven来说,采用"约定优于配置&quo

Struts2 ActionWildcard(通配符配置)约定优于配置

1.新建web Project:Struts2_ActionWildcard2.新建以下的文件:项目图: src: StudentAction.java TeacherAction.java struts.xml WebRoot: index.jsp Studentadd_success.jsp Studentdelete_success.jsp Teacher_add_success.jsp Teacher_delete_success.jsp 3.以下为项目中各文件的代码: (1)strut

Spring 4 官方文档学习(十一)Web MVC 框架之约定优于配置

当返回一个ModelAndView时,可以使用其addObject(Object obj)方法,此时的约定是: An x.y.User instance added will have the name user generated. An x.y.Registration instance added will have the name registration generated. An x.y.Foo instance added will have the name foo gener

#001 约定大于配置

什么叫做约定大于配置? 约定优于配置是一个简单的概念. 系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置. 在大部分情况下,你会发现使用框架提供的默认值会让你的项目运行的更快. 零配置并不是完全没有配置,而是通过约定来减少配置, 减少 XML 开发一个组件,最好提供一些默认值,也就是所谓的约定,如果需要不同的就使用 配置 ,来具体配置组件的内容. 来自为知笔记(Wiz)

开发原则之约定大于配置

开发过程中处处用到了"约定大于配置"的原则,甚至团队开发规范.开发编译环境等等也是要大家约定来执行的.以Java构建为例,从ant到maven再到gradle都是更好更方面的实现了"约定大于配置"的思想. 在ant和bat时代,经常要为每个项目写或修改脚本,即便项目主要目录结构也要在代码里体现. 到maven时代,通过约定简化了很多东西:pom.xml所在的目录应为项目的根目录,假设该目录为${proj-dir},那么Maven有以下假设: ${proj-dir}/

惯例优于配置原则(学习笔记)

惯例优于配置(Convention over Configuration) 来源于Ruby On Rails框架的设计理念,也被认为是Rails大获成功的关键因素之一.这里所谓的惯例,可以理解为框架对编程的一些约束,我们可以根据实现制订的默认准则,通过反射技能完成对象的建立,对象的协作,甚至是使用程序的组装.例如在Rails中对MVC模式的实现中,就事先确立了Model.View和Controller的目录结构与命名规范.在这种情况下,我们不须要对元数据执行 任何配置.ASP.NET MVC框架

在magento中如何调用static block

在magento中如何调用static block?(系统面板内CMS---->static block) 解答:若想在站点页面的某个地方放点静态的内容,比如广告,或者是促销信息之类的,这样的东西完全没有必要新建一个block.完全可以使用cms内的static block.创建完后,记住static block的id并在网站中调用.调用static block三个地方三种方式 phtml中  <?php echo $this->getLayout()->createBlock('

Programming Entity Framework CodeFirst--数据库约定和配置

这一章主要主要讲的是我们的模型如何映射到数据库,而不影响模型,以及不同的映射场景. 一.表名和列名 1.指定表名 [Table("PersonPhotos")] public class PersonPhoto 或 [Table("Locations", Schema="baga")] public class Destination Schema修改数据库架构,默认是dbo. API: modelBuilder.Entity<Destin