# M2有哪些特點
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模型帶來的好處如下:
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_ *表格的圖表:

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個月出安全補丁,自己下載安裝就行。
老版本也會出對應的安全補丁。
## 社區活躍
群里有個小伙子說他經常混https://magento.stackexchange.com
和https://stackoverflow.com/。
幾乎能找到任何你遇到的magento問題帖子并解決。
官方社區為https://community.magento.com/
里面也非常活躍,只要你問問題,肯定會得到答案。
所以,有這么多活躍的玩家,這么靠譜的官方,沒理由不火,沒理由不去用。
- 序言
- 全面解讀Magento2
- Magento2簡介
- Magento2特點
- Magento2目錄結構
- Magento2語法講解
- 運行原理剖析
- 開啟Magento2之旅
- 安裝Magnto2
- 購買阿里云服務器(Ubuntu系統)
- 安裝和配置Nginx/PHP/PHP-FPM
- 配置Mysql并創建數據庫
- 配置Nginx虛擬主機
- 安裝和配置Magento2
- 導入演示數據
- 手把手教你創建git代碼庫
- 續外篇-購買AWS服務器
- 續外篇-Mac下安裝LNMP
- 續外篇-安裝phpmyadmin
- 如何升級php版本
- 使用Magento2
- 創建多網店多域名以及安裝中文語言包
- 創建獨立cms頁面
- 創建分類和產品
- 創建產品屬性
- 創建優惠券
- 導入產品csv
- 下單/發票/發貨/退貨
- M2常用命令
- 如何安裝主題
- 如何安裝插件
- 如何使用API
- 常見問題
- 常見問題 二
- 常見問題 三
- 常見問題 四
- 常見問題 五
- Magento2主題
- 主題框架詳解
- Layout文件詳解
- M2里的JS
- 主題實戰
- 前期準備工作
- 完成首頁
- 重寫分類頁面
- 錦囊妙計
- 產品詳情頁面講解
- 購物車頁面講解
- 支付頁面講解
- 主題修改記錄
- 關于主題的一些學員問答
- Magento2插件
- 插件框架詳解
- XML配置說明
- 插件實戰
- 準備工作
- 寫代碼
- 調試
- 難點解析
- 插件升級
- 插件修改記錄
- 擴展閱讀
- 如何創建cron任務和功能
- 發送郵件(帶附件)
- 如何在代碼里創建屬性
- Magento2線上部署
- 基本流程
- 配置Redis
- 配置Varnish+SSL
- Varnish配置教程(2020年修訂版)
- Paypal設置
- 一些優化
- Magento2 版本升級
- v2.3.0版本填坑指南
- v2.4.x升級指南
- 配置nginx pagespeed模塊進行加速
- M1數據庫遷移到M2指南
- 安裝配置Elasticsearch
- Magento2常用工具
- 網站測速分析工具
- 在線創建插件模塊
- M2后臺可視化編輯器里的標簽變量
- 遇到問題,我該怎么做
- 常用代碼
- SEO在線分析工具
- 本地用xdebug遠程調試mgtdev2服務器的項目
- 后續之路