暂定本章为这个系列最后一章,还是继续沿用模块的别名(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的底层源代码,总是有收获的。

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

  1. SpringMVC介绍之约定优于配置

    SpringMVC介绍之约定优于配置 所谓的约定优于配置就是指在程序开发过程中我们约定好一些规则可以使我们更少的进行配置和代码编写.就这么简单的一句话可能你还不是很懂什么是约定优于配置,没关系,看完后 ...

  2. convention over configuration 约定优于配置 按约定编程 约定大于配置 PEP 20 -- The Zen of Python

    为什么说 Java 程序员必须掌握 Spring Boot ?_知识库_博客园 https://kb.cnblogs.com/page/606682/ 为什么说 Java 程序员必须掌握 Spring ...

  3. spring boot约定优于配置的这种做法在如今越来越流行了

    约定优于配置的这种做法在如今越来越流行了,它的特点是简单.快速.便捷.但是这是建立在程序员熟悉这些约定的前提上.而 Spring 拥有一个庞大的生态体系,刚开始转到 Spring Boot 完全舍弃 ...

  4. Maven之(八)约定优于配置

    maven的配置文件看似很复杂,其实只需要根据项目的实际背景,设置个别的几个配置项而已.maven有自己的一套默认配置,使用者除非必要,并不需要去修改那些约定内容.这就是所谓的"约定优于配置 ...

  5. spring boot中的约定优于配置

    Spring Boot并不是一个全新的框架,而是将已有的Spring组件整合起来. Spring Boot可以说是遵循约定优于配置这个理念产生的.它的特点是简单.快速和便捷. 既然遵循约定优于配置,则 ...

  6. Struts2注解 及 约定优于配置

    Struts2注解 1 Struts2注解的作用 使用注解可以用来替换struts.xml配置文件!!! 2 导包 必须导入struts2-convention-plugin-2.3.15.jar包, ...

  7. 8.Maven之(八)约定优于配置

    转自:“https://blog.csdn.net/qq_25460531/article/details/79423961” maven的配置文件看似很复杂,其实只需要根据项目的实际背景,设置个别的 ...

  8. 【面试普通人VS高手系列】Spring Boot的约定优于配置,你的理解是什么?

    对于Spring Boot约定优于配置这个问题,看看普通人和高手是如何回答的? 普通人的回答: 嗯, 在Spring Boot里面,通过约定优于配置这个思想,可以让我们少写很多的配置, 然后就只需要关 ...

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

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

随机推荐

  1. OpenCV2:第一章 图像表示

    一.简介 在OpenCV中,可以用C++语法的Mat类来表示一张图像 也可以用C语法的lpllmage或CvMat结构体来表示一张图像 1.单通道像素值 2.多通道像素值 OpenCV默认颜色顺序为B ...

  2. Visual Studio 安装VS10x CodeMAP

    最近出差,用的是公司电脑,电脑安装的是Visual Studio 2017 VS10x CodeMap 支持Visual Studio 2010, 2012, 2013, 2015,不支持Visual ...

  3. Sqlserver查询结果集插入新表

    数据库“Test” 数据库“Test2” 表 “fromTable” 表 “toTable” 表 “newTable” 字段 “name”,“age”,“gender” 原因:公司有2个数据库,一个是 ...

  4. es6(三set和map数据结构)

    es6中提供了一个新的数据结构Set,他有点类似数组,但和数组不同的是,在里面你如果写入重复的值的话,他不会显示重复值. const s =new Set(); [2,3,4,5,6,6,6,7,8, ...

  5. 访问修饰词--Java

    public(公共的) 权限: 完全公开 protected(受保护的) 权限: 对子类和同包中的其他类公开 default(默认的,可不写) 权限: 对同包中的其他类公开 private(私有的) ...

  6. 自定义shell脚本

    当脚本需要加入固定的内容时就可以直接使用此文件 1.在用户的家目录下创建.vimrc文件(root用户就在root目录下创建,其他用户就在其他用户家目录下创建这个隐藏文件) 2. 将以下代码写入此文件 ...

  7. 《Java编程思想》笔记14.类型信息

    运行时类型信息使得你可以在运行时发现和使用类型信息,主要有两种方式: "传统的"RTTI,它假定我们在编译时已经知道了所有的类型: "反射"机制,它允许我们在运 ...

  8. [NOI2001] 炮兵阵地 (状压Dp经典例题)

    如果您的电脑比较优秀能在 1sec 内跑过 2^1000 的时间复杂度,不妨你可以尝试一下,其实实际时间复杂度远远少于 2^1000,作为骗分不错的选择QAQ,然后我们来分析一下正解: 很显然此题是一 ...

  9. Codeforces 892 B.Wrath

    B. Wrath time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  10. BZOJ1696: [Usaco2007 Feb]Building A New Barn新牛舍

    n<=10000个点(xi,yi),找到一个不同于给出的所有点的点,使得该点到所有点的曼哈顿距离最小并找出这样的点的个数. 第一眼看上去这不是中位数嘛,奇数一个点偶数一片,然后找一下这篇区域有几 ...