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个月出安全补丁,自己下载安装就行。 
 老版本也会出对应的安全补丁。 
