# M2有哪些特点 M2是基于`zend framework`框架的,只不过在它身上加了一层华丽的皮,隐藏了`zend framework`的底层接口,封装了自己的接口。 所有我们写代码的时候,只需要调用M2自己的类和方法就行。 ![](https://box.kancloud.cn/36d51d84ccff49bded8f9233664ae58d_1200x900.png) 如果说Linux一切设备皆文件,那么M2一切设计皆XML。 不管是主题还是插件还是API还是数据库 都有XML的身影,正因为它,M2才这么灵活强大! 如下几个特点 算是很牛逼到位之处: ## 页面xml布局 让你在不动源码的情况下,尽情任意修改页面布局。 每个页面都有唯一的辨识符的xml文件,这个页面的布局都由该xml生成,你可以任意增删改这个xml文件,实现各种效果。 xml文件里放的是各种block,这个block就是每个块,真正输出内容的地方。 以产品详情页为例: ![](https://box.kancloud.cn/1749c8311ce694cdc76474490bb8698a_720x460.png) 可以看到非常灵活,至于具体怎么增删改,我们在`Magento2主题`这一章节具体讲解。 ## 数据库EAV结构 > `E` ->实体 > `A` -> 属性 > `V` -> 值 EAV模型是一种数据模型,用于描述实体的数量预计会很大,但事实上,实体中要使用的属性数量并不多。 M2这么设计,其实说白了就是为了灵活性,在不影响主干的基础上,任意新增删除属性。 EAV模型说白了就是分表,不需要把所有字段都放在主表里,而是按类型存放在不同的副表上。 对于字段少的项目来说 EAV其实没啥用 效率不高。 > 按照常规做法,比如一个产品的所有相关属性都会存放在产品表里,增删改查的都是这一个表。 > EAV模式 就是把这些属性按照类型独立分开存放到不同表里的。 > 所有查询属性值的时候会比较麻烦 要联表查询。 > 不过M2里不用担心,他提供了非常简单的方法,直接get属性名就得到值了,不需要你手动去写sql查表。 ~~~ 实体存储的是数据类型的信息。 就Magento而言,就是Customer,Category,Product等。 属性是每个实体的单独属性(比如name,weight,email)。 值是实体某个属性的值。 ~~~ 比如,产品有个属性叫产地(Manufacture),它的值为中国。 那么产品就是实体,Manufacture就是属性,中国就是值。 EAV模型带来的好处如下: 1. 灵活的多功能数据结构(可以在不更改数据库模式的情况下更改属性数量)。 2. 为给定实体添加新属性时,我们有可能在其他实体中使用它 3. 快速实施。 EAV实体的数据库模式: 1. eav_entity - (E)实体表。 2. eav_entity_attribute(A)属性表 3. eav_entity_ {type}(V) - 值表。{type} - datetime,decimals,int,text和varchar。 4. eav_attribute 里面是所有实体的属性 带有eav_ *表格的图表: ![](https://box.kancloud.cn/b82e0d2883d05db4fcb83df5815a64ac_1600x1356.png) Magento 2中有哪些EAV实体: 实体列表可以在eav_entity_type表中找到: > customer > customer_address > catalog_category > catalog_product > order > invoice > creditmemo > shipment Magento 2中有哪些EAV属性类型: > eav_entity_int > eav_entity_varchar > eav_entity_text > eav_entity_decimal > eav_entity_datetime 这5种属性类型就相当于字段类型。 * `int` 对应mysql字段的int类型 * `varchar` 对应mysql字段的varchar类型 * `text` 对应mysql字段的text类型 * `decimal` 对应mysql字段的decimal类型 * `datetime`对应mysql字段的datetime类型 比如产品的name 是varchar类型。 他的值存在catalog_product_entity_varchar表里。 知道了这个原理,你就很轻松的知道属性和值在哪个表里。 聪明的你会觉得,把属性分散存在不同的表里,如果要查询全部属性的话,要联十几张表,是不是太耗资源了? 这点,M2官方也考虑到了,以产品为例,他提供了catalog_product_flat表,也就是说后台开启flat模式后,查产品数据就直接读取这个表,他把属性都存放在这个表里了。 catalog_product_flat是按store id来分的。如果你有多网店的话。 比如: ~~~ catalog_product_flat_1 //代表store id为1的所有产品数据 catalog_product_flat_2 ////代表store id为2的所有产品数据 ~~~ ## 缓存 俗话说东西吃多了就变胖了,胖了就不灵活了,走路都喘气。 M2是个灵活的胖子,他的缓存是其杀手锏。 ![](https://box.kancloud.cn/eb5b9b911f52cac037b69706b5ac2721_2188x1262.png) 可以看到,缓存的类型多不胜数,后台轻松设置。 默认是开启了全部缓存类型。 缓存多了 也有很多弊端,就是对开发者不友好,导致开发过程中改了代码后 发现前台页面总是不生效,折腾半天 原来是缓存的问题。 所以我建议是开发版本里禁用所有缓存。 线上版本开启所有缓存。 我们刚开始不需要搞清楚所有缓存类型代表什么意思。等你熟悉一段时间后 再研究会更明白。 以后如果有高级课程的话,我会一个个分析讲解。 ## 模块化 composer是个好东西,希望你会用。 m2的核心代码都是模块化的,可以任意开启禁用。 同理,第三方插件和主题也都是模块化的,可以通过composer来安装升级或者打包上传。 如果你安装了第三方插件或者看M2的核心代码的话,你会发现都有composer.json这个玩意。 这个就是用来安装/打包上传插件的。里面定义了各种依赖库以及插件源地址 ## 安全性 M2的安全性也是其杀手锏,几乎没有被黑过。 社区会每隔1-2个月出安全补丁,自己下载安装就行。 老版本也会出对应的安全补丁。 ## 社区活跃 群里有个小伙子说他经常混https://magento.stackexchange.com 和https://stackoverflow.com/。 几乎能找到任何你遇到的magento问题帖子并解决。 官方社区为https://community.magento.com/ 里面也非常活跃,只要你问问题,肯定会得到答案。 所以,有这么多活跃的玩家,这么靠谱的官方,没理由不火,没理由不去用。