M2是基于zend framework
框架的,只不过在它身上加了一层华丽的皮,隐藏了zend framework
的底层接口,封装了自己的接口。
所有我们写代码的时候,只需要调用M2自己的类和方法就行
如果说Linux一切设备皆文件,那么M2一切设计皆XML。
不管是主题还是插件还是API还是数据库 都有XML的身影,正因为它,M2才这么灵活强大!
如下几个特点 算是很牛逼到位之处:
页面xml布局
让你在不动源码的情况下,尽情任意修改页面布局。
每个页面都有唯一的辨识符的xml文件,这个页面的布局都由该xml生成,你可以任意增删改这个xml文件,实现各种效果。
xml文件里放的是各种block,这个block就是每个块,真正输出内容的地方。
以产品详情页为例:
可以看到非常灵活,至于具体怎么增删改,我们在Magento2主题
这一章节具体讲解。
数据库EAV结构
E
->实体
A
-> 属性
V
-> 值
EAV模型是一种数据模型,用于描述实体的数量预计会很大,但事实上,实体中要使用的属性数量并不多。
M2这么设计,其实说白了就是为了灵活性,在不影响主干的基础上,任意新增删除属性。
EAV模型说白了就是分表,不需要把所有字段都放在主表里,而是按类型存放在不同的副表上。
对于字段少的项目来说 EAV其实没啥用 效率不高。
按照常规做法,比如一个产品的所有相关属性都会存放在产品表里,增删改查的都是这一个表。
EAV模式 就是把这些属性按照类型独立分开存放到不同表里的。
所有查询属性值的时候会比较麻烦 要联表查询。
不过M2里不用担心,他提供了非常简单的方法,直接get属性名就得到值了,不需要你手动去写sql查表。
实体存储的是数据类型的信息。
就Magento而言,就是Customer,Category,Product等。
属性是每个实体的单独属性(比如name,weight,email)。
值是实体某个属性的值。
比如,产品有个属性叫产地(Manufacture),它的值为中国。
那么产品就是实体,Manufacture就是属性,中国就是值。
EAV模型带来的好处如下:
- 灵活的多功能数据结构(可以在不更改数据库模式的情况下更改属性数量)。
- 为给定实体添加新属性时,我们有可能在其他实体中使用它
- 快速实施。
EAV实体的数据库模式:
- eav_entity - (E)实体表。
- eav_entity_attribute(A)属性表
- eav_entity_ {type}(V) - 值表。{type} - datetime,decimals,int,text和varchar。
- eav_attribute 里面是所有实体的属性
带有eav_ *表格的图表:
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是个灵活的胖子,他的缓存是其杀手锏。
可以看到,缓存的类型多不胜数,后台轻松设置。
默认是开启了全部缓存类型。
缓存多了 也有很多弊端,就是对开发者不友好,导致开发过程中改了代码后 发现前台页面总是不生效,折腾半天 原来是缓存的问题。
所以我建议是开发版本里禁用所有缓存。 线上版本开启所有缓存。
我们刚开始不需要搞清楚所有缓存类型代表什么意思。等你熟悉一段时间后 再研究会更明白。
模块化
composer是个好东西,希望你会用。
m2的核心代码都是模块化的,可以任意开启禁用。
同理,第三方插件和主题也都是模块化的,可以通过composer来安装升级或者打包上传。
如果你安装了第三方插件或者看M2的核心代码的话,你会发现都有composer.json这个玩意。
这个就是用来安装/打包上传插件的。里面定义了各种依赖库以及插件源地址
安全性
M2的安全性也是其杀手锏,几乎没有被黑过。
社区会每隔1-2个月出安全补丁,自己下载安装就行。
老版本也会出对应的安全补丁。