- lkm's Blog
- Log in to post comments
drupal 8 入門
2016-09-12 16:34:11
2016年9月11日drupal深圳社區組織了一次聚會,做了個D8入門分享,這裡整理了一下,D8正式版是2015年11月19日發布,我也是從這個時候開始學習研究drupal ,過去差不多一年時間了,入門過程的很多東西記憶猶新,可能將來這些感受會慢慢的忘記,所以在這一次聚會徵集的時候我把它記錄分享出來,一來可以幫助處於drupal大門之外正在觀望的朋友以及決定深入研究正在入門的朋友,二來自己也做一個筆記,drupal很龐大,我的學習還處於不斷進行中,有些地方可能講的不準確,還請已經走過來的朋友指正。
首先我做一個簡短的自我知識背景介紹,這樣可以和大家產生一個共鳴,理解到我學習drupal過程中出現的感受,從事php有8年時間,經歷學習過c、c++、java現在專注於php,在web領域深入理解過的cms有phpcms,帝國cms,特別是帝國cms,為它開發了一些插件。深入理解使用的框架有CodeIgniter簡稱ci,用ci開發過微信公眾號管理系統等等,這些背景知識會在學習drupal的過程中產生對比和共振。以上就是大致的背景知識,我沒有了解過drupal8以前的版本,第一次接觸drupal就是從這個面向對象的d8開始的,下面分幾個部分來講。
ADVERTISEMENT
一:為什麼選擇drupal
希望這部分對正在判斷要不要深入研究drupal的朋友和正在堅持學習D8的朋友們有用。準備花大量時間去學習一個cms,選擇一定是非常慎重的,我認為有兩件東西非常重要:精力和堅持,它直接決定一個人整個生命周期能產出的價值,這是我選擇php又進一步選擇其中的drupal最底層的一個原因,人的精力必須要得到尊重和高效利用,選擇php就是因為它的設計哲學是人的時間比機器的時間更加寶貴,我想這當然是對我們有限生命的人類來說是應該的,相比其他語言它更加智能,為我們做的更多,省更多的時間,直接對一個實例化的對象賦值一個不存在的屬性是不是很自由方便呢?不用考慮數據類型,但想考慮的時候又能考慮到是不是很自由方便呢?這些都是c和java等不具備的,至於拿運行速度說事的人我想說可能得直接去用彙編或者機器語言了,這裡我不是說哪個開發語言不好,他們有各自的歷史角色和定位,存在必有道理,我認同php的設計哲學,所以我選擇了php,說了那麼多php其實我是想說選擇drupal的原因和它根本上是一模一樣的,這裡說說我的經歷,進入web領域以來建站開發是從dz開始的,但他只是個論壇,我想要的很多東西沒有,所以開始了cms之路,使用大眾化的cms極大的滿足了很多需求,相比自己去開發一個專用系統節省了不少的時間,那時候我主要選擇帝國cms做工具,和帝國同行是從6.0版本開始的,對於當時沒有太多想法的我來說那是很滿足的,可問題慢慢的出現,在2009年的時候我接觸過勞務派遣,就是把許多的臨時工在不同的工廠之間進行調派,大量的工作需要電話和現場處理,於是想到建立一個網站系統去處理工廠與工人的結算問題、互相評價問題、自動調派問題等等,這個時候再看帝國cms就已經嚴重的不能滿足需求了,擺在面前有兩條路,首先就是大規模的二次開發,這個時候發現如果這麼做,帝國升級的時候會產生大量的工作要做,而且由於帝國歷史原因程序裡面的命名等開發規範不是太規範,這樣對協同開發產生不利影響,所以放棄了。只能進行第二條路:完全的自己開發,如果從底層php級別開始的話無疑浪費大量時間,團隊運作成本很高,這個時候開始把希望寄託於php框架,經過對比後選擇了ci框架,用了框架之後感覺是很省事而且自由,也能容易的找到協同開發的人員,可是事情還是感覺遠遠的不完美,有大量的組件在php大社區裡面有功能類似的,但各自都在重複的發明輪子,如果已經發明的輪子不夠好重新發明當然是好的,但如果已經很好了,還有必要嗎,而且自己真的有精力把各個細分領域的輪子都給造一遍嗎?當然是否定的。這個時候多麼希望php大社區的尖端人才統一的規範化自己在行的東西,讓使用者可以把它們像搭積木一樣用到自己的系統中去,這個時候我開始尋求新的解決之道,開始在全世界搜索,最開始找到joomula,但由於那段時間正在開發微信公眾號管理系統暫時沒有去理睬這個事情,等2015年回過頭來的時候意外的發現了drupal,結果一番搜索對比之後感覺joomula和drupal的對比如同windows和linux一樣,一直感覺linux才是極客的玩具(在這裡我沒有真的去看過joomula的實現,僅僅來源於一些資料,白宮使用drupal更加印證這一點,如果有誰研究過這兩cms很希望能發一些對比出來),簡單接觸之後發現drupal很多概念比較抽象而且學習難度更高,正合我意,往往越抽象的東西越接近事物的本質,會越強大越靈活,就像數學一樣,這個說明drupal應該是很強大的,另外一方面學習曲線高,強大的東西這是必然的,這是最初的心路,後來了解到它在世界範圍內廣泛使用,有活躍的社區,這點很重要,有生態才有標準才有協作,才能不重複發明輪子,所以決定深入的學習drupal,選擇drupal還有一個原因:現在很多網站還是給人類看的,對機器目前也只考慮到了殘疾人的殘障輔助設備和搜尋引擎,而當今正在進入萬物互聯的世界,以後越來越多的會給機器看,drupal的格式協商機制就很好的滿足了這個,目前國內大眾的cms還沒有看到誰考慮到了物聯網對網站的要求,現在的網站和以前已經不大一樣了正在向網絡應用系統轉變,不單純的指一系列的html網頁集合,而drupal有強有力的社區支持有生態圈,這一點會做的很好,社區開源軟體的先天優勢讓它不落伍,值得把自己的時間花在上面。通過這些應該可以看出選擇drupal的理由。
二:需要具備的知識準備/工具環境準備
D8很先進,對運行環境要求相對於目前國內開源系統來說很前衛,運行環境要求是:php5.59 瀏覽器IE9+,自身也採用前沿的技術組件等等,D8就是一群極客的化身,我感覺國內的軟體開發者首要想的是去適應環境,而國外軟體開發者更多的是考慮系統本身怎麼極致,會主動改造環境, 這是兩種哲學狀態。
那麼要開始D8需要提前準備哪些背景知識?怎麼建立工作環境:
背景知識:
1:面向對象開發模式,讓自己從過程式開發方式中轉變過來
2:了解php5.x各版本的差異,比如三元運算符的簡化形式?:、數組的簡化形式、運算結合性質等等,這些在php的官方網站有專門的升級頁面來介紹這些,在官網手冊附錄部分http://php.net/manual/zh/appendices.php,drupal裡面使用了很多新特性,如果不理解,在看代碼的時候會被老是打斷去查詢用法,每個開發者建議自備一個文檔去記錄常用的快速備查,比如什麼特性是在哪個版本開始的,自己對某技術難點的理解,在這裡建議大家查詢php語言本身的東西首先到php官方網站,如果查詢不能滿足再到其他地方搜索,官網目前很完善,信息也比較及時,我發現其他一些地方的信息是不完備甚至是錯誤的。
3:熟悉PHP標準庫 (SPL),比如drupal搜索主題、模塊等擴展時就用到了spl裡面的目錄疊代器
4:了解psr規範,很簡單,也很簡短,官方地址是http://www.php-fig.org/psr/
5:先學習composer,它是drupal的基石之一,是一個獨立的軟體,進行依賴管理,通過php的類文件自動加載機制產生類加載器,這個是drupal8程序啟動的第一件事情
6:學習symfony,地址是http://symfony.com/,其實開始不用精細的學習,並不是不了解他就不能理解drupal,但drupal是建立在它之上的,開始少許理解會對drupal的學習加速,對symfony深入學習可以在drupal學習的同時進行,學習drupal前先看一看symfony各組件的文檔,目前drupal8.1.9使用是的symfony2.8版本,symfony現在已經是symfony3.1版本了,很多棄用的東西可以不用理會,比如依賴注入組件的容器範圍Scope,這些在程序裡面有棄用提示
7:學習Twig,在drupal外獨立使用一下它,開始只需要知道使用方法即可,不需要去看程序代碼,它用到了編譯原理的知識,沒有這方面知識可能難於理解,關於編譯原理這一塊知識量很大,是專門的一個領域,以後可以慢慢研究。
8:了解一下軟體設計模式方面的知識,drupal裡面到處是設計模式,但不建議去買大部頭的書來學,百度一下,看一些小小的程序案列就能明白,太多的書把設計模式講複雜了,搞的人云里霧裡,反而打擾積極性,很多事情本不難,都是溝通惹的禍。
工具環境準備:
1:首先解決語言不通的問題,建議大家安裝「有道詞典」,它可以對瀏覽器劃詞翻譯,強迫自己多到英文的drupal官網去看,開始會不習慣,但慢慢的就習慣使用英語,越來越不需要翻譯軟體的輔助
2:找到合手的開發工具,我比較喜歡的是phpdesigner、phpstorm編輯軟體,和phpstudy環境軟體。
社區裡面有工具環境這方面的專門頁面,大家可以看一看
3:社區概況,資料查詢、規範
我的學習是這樣一個過程:先看一遍使用文檔,再看一遍api文檔、最後去讀代碼。一定不要一開始就試圖通過讀代碼來了解drupal,因為drupal太龐大,如果沒有一些概念的認識和架構的全局印象圖,會讓人承受不了,讀代碼最討厭的就是不能和開發者思維同步。
在看使用文檔的時候,推薦看一本書《Beginning-Drupal8》,Todd Tomlinson寫的,drupal中國站drupalchina.cn的站長龍馬已經組織翻譯了這本書,我也參加了這本書的翻譯,該書面向新手,比較淺顯,但能對drupal的使用看個大概,目前20160910官網(如無特別指出均是指英文的官網)正在進行文檔的重組,不知道重組後效果怎麼樣,所以對以後的文檔使用現在沒法分享,在這之前我看完了所有的文檔,印象是是這樣的:drupal各個版本間文檔有交叉混雜,沒有徹底分開,文檔均來源於社區,由很多個人寫成,詳細程度不一,排序也有點問題,甚至有些部分的排序是按照首字母來進行的,沒有照顧到學習心理問題,和主次問題,所以大家不要試圖去按次序閱讀所有的文檔,根據自己的實際情況、學習曲線和關注點跳躍式的去查詢閱讀。雖然不完善但整個社區的文檔還是不錯的,能解決大部分疑惑,沒有詳細資料的情況下代碼注釋會成為最後選擇,實在找不到可以先記錄下來,後面的讀代碼階段一定能理解,或者是諮詢他人,了解清楚使用和一些概念後就進入第二階段,讀api文檔,api文檔是自動從程序代碼的注釋中提取的,所以是能跟上新版本的節奏,這些文檔不長,短於第一階段的開發文檔,所以能快速閱讀建立程序運行印象,如果有不清楚的可以到社區發問,或是記錄下來在讀代碼階段一定會明白,比如很多新人就不明白模塊的文件夾名、info文件名、及裡面的name值有什麼區別,但看完擴展發現類後就好會豁然開朗,這給讀代碼帶來樂趣,一時不明白以後終將明白。
關於規範,這是一個很重要的話題,官網有詳細的文檔,裡面清晰的描述了文件命名、變量函數類命名、組織、提問怎麼提等等一系列規範,在進行開發之前一定是要了解的,這樣才能和社區協作,將來為社區提供模塊才能被接受,詳細的規範請大家去官網看,不守規範會被鄙視,無法使社區力量強大
關於查詢,官網的搜索功能都比較強大,但還得依仗大家的英語水平,才能提出準確的關鍵字,這也是為什麼我推薦大家看英文的官網,即使用翻譯軟體去看,因為那裡的資料最豐富,自己也能慢慢接受英語的使用。
這裡額外說一下,drupal官網分享的一些連結在國內打不開,原因大家都知道,甚至有時候drupal官網本身都打不開,這個時候大家可以使用vpn網絡,搜索一下有很多,找一個註冊帳號,每個月二三十塊錢解決,谷歌、Facebook等等就在眼前了
4:drupal運作框架,啟動邏輯
學習drupal先應該對它的整體架構及執行流程有宏觀上的了解,知道這個後,在後面的學習中就明確知道自己處於邏輯大廈的哪個地方,為什麼程序要這樣設計等等,現在來說一說這塊內容:
drupal8是建立在symfony開源框架之上的,drupal8.1.9使用的是symfony2.8,symfony是一款非常流行的框架,強調模塊化,由許多組件構成,組件可復用,相互獨立解耦,在symfony的官網首頁說symfony就是一個可復用的php組件集,我們可以將任何一個組件獨立的運用到自己的應用程式中來,在symfony官網裡面每一個組件都有獨立的文檔,這些組件有些被drupal8直接使用,有些根據D8自己的特性進行了修改,有些則沒有使用,可以說學習Drupal8你將也會順帶著學習完一款如此優秀的框架(symfony的作者Fabien Potencier法賓是個狂人,從94年就開始專注於web,模板引擎twig就是出自他手,對RFC文檔十分了解)。現在來看一下symfony的執行流程【收到請求》查找處理器》解析參數》執行處理器》產生響應】:這個流程是drupal的主流程,drupal8是在此基礎上細化的,symfony的執行流程是由它的http-kernel組件定義,symfony認為任何一個網站系統其實就是一個把請求轉換為響應的系統,所以以此為標準來設計了這個流程。drupal8的流程是建立在symfony流程之上進行細化的:
這個流程圖請下載pdf文檔放大看。
好了現在了解了drupal8的架構和執行流程,我們來看一看實際的程序代碼是怎麼開始的,她是怎麼執行的:
也可以說Drupal8是遵循mvc模式的,他有唯一的一個統一的入口,所有的請求被伺服器通過.htaccess配置轉接到index.php,一般需要一個漂亮的url的話需要開啟伺服器的重寫模塊,如果沒有則需要用查詢串的方式明確定義到這個文件上來,不管怎麼樣整個系統都是從這個文件開始執行的,下面談一下開始執行後它所做的事情:
1:調用composer自動生成的類加載器,它通過php的自動加載機制憑藉名字空間去包含include類文件,不必在程序代碼裡面手動包含,裡面已經配置好了系統基本的加載路徑等對應關係
2:啟動drupal處理核心,將請求對象傳給他,讓他將其轉換為響應頁面,然後發送給瀏覽器
3:完成請求,發送出頁面後,再做一些收尾的工作
簡單講就這麼幾步,核心工作集中在核心上,那麼核心如何工作?它其實做了兩大塊事情,先準備服務容器,也叫依賴注入容器,然後讓容器裡面的服務在http-kernel服務的流程控制下運作起來,相互作用產生響應,我們看一下drupal容器準備完成之前都做了什麼,是怎麼完成容器對象的,容器可以說是D8學習的重中之重,他是系統的中樞,這就是DrupalKernel.php在完成的事情,從名字可以看出它的drupal核心地位,可以打開core/lib/Drupal/Core/DrupalKernel.php看一看:
1:預置啟動環境,它加載基本的D8函數庫,並設置php有一個統一的運行環境,比如session配置、編碼檢查、錯誤報告、設置異常處理函數等等,都是在這個階段完成的
2:初始化設置,根據請求判斷是哪一個站點,(這裡說一下drupal8的多站點功能,它其實就是多個站點復用同一套程序代碼而已,而且僅此而已,從邏輯上講是獨立的網站,他們有自己獨立的資料庫,站點與站點並無關聯,這個和站群是有區別的),然後加載這個站點的配置文件,配置文件是require進系統裡面的,這可以看出可以在配置文件settings.php中進行程序編寫,甚至退出系統。然後判斷域名是否是被允許的域名
3:判斷系統是否已經安裝,如果系統尚未安裝的話轉向安裝程序。
4:如果已經安裝則啟動核心,在這個階段會先建立一個基本的容器,稱之為引導容器,它為後續工作提供資料庫連接和緩存支持,有這樣的準備之後才開始真正的初始化服務容器。
程序進入初始化服務容器階段,這裡有個注意事項:在drupal核心的lib下面(core\lib\Drupal)有兩個文件夾:組件Component、核心Core,很多初學者不知道為什麼要把庫分到這兩個類別裡面,他們的區別是核心裏面的程序是和drupal本身緊密聯繫的,沒有考慮給其他項目復用,而組件裡面的東西是由drupal社區開發但可以離開drupal獨立復用的,或者在symfony框架範圍內復用,這樣的安排適合管理代碼,協同開發。
容器初始化:
1:查找緩存中是否有有效的容器定義數據,如果有,直接使用它初始化容器
2:如果沒有緩存,去構建容器定義數據,編譯一個容器
3:初始化服務提供器來準備容器定義數據,加載核心和擴展的services.yml文件,同時加載服務提供器,擴展是通過擴展發現類來完成的,他使用spl的目錄疊代器和過濾疊代器去查找有效的info.yml文件
4:編譯容器,編譯容器就是在容器形成前有一次機會讓服務間相互作用和關聯(有些關聯是在定義服務參數時無法考慮到的)比如通過服務標籤將訪問檢查器註冊到訪問管理器裡面,這個屬於依賴注入組件的範疇,稱為編譯Pass
5:容器形成後附加一些外部合成對象進去,並把容器賦值給全局的Drupal類靜態儲存引用,以後就可以使用\Drupal:: getContainer取得容器,方便全局引用
6:容器已經形成了,將容器定義數據導出Dumper,存儲到緩存,以便下次請求提高性能
至此第一大塊的工作完成,後面開始容器裡面的服務互動過程, http-kernel開始運作
2016年9月11日drupal深圳社區組織了一次聚會,做了個D8入門分享,這裡整理了一下,D8正式版是2015年11月19日發布,我也是從這個時候開始學習研究drupal ,過去差不多一年時間了,入門過程的很多東西記憶猶新,可能將來這些感受會慢慢的忘記,所以在這一次聚會徵集的時候我把它記錄分享出來,一來可以幫助處於drupal大門之外正在觀望的朋友以及決定深入研究正在入門的朋友,二來自己也做一個筆記,drupal很龐大,我的學習還處於不斷進行中,有些地方可能講的不準確,還請已經走過來的朋友指正。
首先我做一個簡短的自我知識背景介紹,這樣可以和大家產生一個共鳴,理解到我學習drupal過程中出現的感受,從事php有8年時間,經歷學習過c、c++、java現在專注於php,在web領域深入理解過的cms有phpcms,帝國cms,特別是帝國cms,為它開發了一些插件。深入理解使用的框架有CodeIgniter簡稱ci,用ci開發過微信公眾號管理系統等等,這些背景知識會在學習drupal的過程中產生對比和共振。以上就是大致的背景知識,我沒有了解過drupal8以前的版本,第一次接觸drupal就是從這個面向對象的d8開始的,下面分幾個部分來講。
一:為什麼選擇drupal
希望這部分對正在判斷要不要深入研究drupal的朋友和正在堅持學習D8的朋友們有用。準備花大量時間去學習一個cms,選擇一定是非常慎重的,我認為有兩件東西非常重要:精力和堅持,它直接決定一個人整個生命周期能產出的價值,這是我選擇php又進一步選擇其中的drupal最底層的一個原因,人的精力必須要得到尊重和高效利用,選擇php就是因為它的設計哲學是人的時間比機器的時間更加寶貴,我想這當然是對我們有限生命的人類來說是應該的,相比其他語言它更加智能,為我們做的更多,省更多的時間,直接對一個實例化的對象賦值一個不存在的屬性是不是很自由方便呢?不用考慮數據類型,但想考慮的時候又能考慮到是不是很自由方便呢?這些都是c和java等不具備的,至於拿運行速度說事的人我想說可能得直接去用彙編或者機器語言了,這裡我不是說哪個開發語言不好,他們有各自的歷史角色和定位,存在必有道理,我認同php的設計哲學,所以我選擇了php,說了那麼多php其實我是想說選擇drupal的原因和它根本上是一模一樣的,這裡說說我的經歷,進入web領域以來建站開發是從dz開始的,但他只是個論壇,我想要的很多東西沒有,所以開始了cms之路,使用大眾化的cms極大的滿足了很多需求,相比自己去開發一個專用系統節省了不少的時間,那時候我主要選擇帝國cms做工具,和帝國同行是從6.0版本開始的,對於當時沒有太多想法的我來說那是很滿足的,可問題慢慢的出現,在2009年的時候我接觸過勞務派遣,就是把許多的臨時工在不同的工廠之間進行調派,大量的工作需要電話和現場處理,於是想到建立一個網站系統去處理工廠與工人的結算問題、互相評價問題、自動調派問題等等,這個時候再看帝國cms就已經嚴重的不能滿足需求了,擺在面前有兩條路,首先就是大規模的二次開發,這個時候發現如果這麼做,帝國升級的時候會產生大量的工作要做,而且由於帝國歷史原因程序裡面的命名等開發規範不是太規範,這樣對協同開發產生不利影響,所以放棄了。只能進行第二條路:完全的自己開發,如果從底層php級別開始的話無疑浪費大量時間,團隊運作成本很高,這個時候開始把希望寄託於php框架,經過對比後選擇了ci框架,用了框架之後感覺是很省事而且自由,也能容易的找到協同開發的人員,可是事情還是感覺遠遠的不完美,有大量的組件在php大社區裡面有功能類似的,但各自都在重複的發明輪子,如果已經發明的輪子不夠好重新發明當然是好的,但如果已經很好了,還有必要嗎,而且自己真的有精力把各個細分領域的輪子都給造一遍嗎?當然是否定的。這個時候多麼希望php大社區的尖端人才統一的規範化自己在行的東西,讓使用者可以把它們像搭積木一樣用到自己的系統中去,這個時候我開始尋求新的解決之道,開始在全世界搜索,最開始找到joomula,但由於那段時間正在開發微信公眾號管理系統暫時沒有去理睬這個事情,等2015年回過頭來的時候意外的發現了drupal,結果一番搜索對比之後感覺joomula和drupal的對比如同windows和linux一樣,一直感覺linux才是極客的玩具(在這裡我沒有真的去看過joomula的實現,僅僅來源於一些資料,白宮使用drupal更加印證這一點,如果有誰研究過這兩cms很希望能發一些對比出來),簡單接觸之後發現drupal很多概念比較抽象而且學習難度更高,正合我意,往往越抽象的東西越接近事物的本質,會越強大越靈活,就像數學一樣,這個說明drupal應該是很強大的,另外一方面學習曲線高,強大的東西這是必然的,這是最初的心路,後來了解到它在世界範圍內廣泛使用,有活躍的社區,這點很重要,有生態才有標準才有協作,才能不重複發明輪子,所以決定深入的學習drupal,選擇drupal還有一個原因:現在很多網站還是給人類看的,對機器目前也只考慮到了殘疾人的殘障輔助設備和搜尋引擎,而當今正在進入萬物互聯的世界,以後越來越多的會給機器看,drupal的格式協商機制就很好的滿足了這個,目前國內大眾的cms還沒有看到誰考慮到了物聯網對網站的要求,現在的網站和以前已經不大一樣了正在向網絡應用系統轉變,不單純的指一系列的html網頁集合,而drupal有強有力的社區支持有生態圈,這一點會做的很好,社區開源軟體的先天優勢讓它不落伍,值得把自己的時間花在上面。通過這些應該可以看出選擇drupal的理由。
二:需要具備的知識準備/工具環境準備
D8很先進,對運行環境要求相對於目前國內開源系統來說很前衛,運行環境要求是:php5.59 瀏覽器IE9+,自身也採用前沿的技術組件等等,D8就是一群極客的化身,我感覺國內的軟體開發者首要想的是去適應環境,而國外軟體開發者更多的是考慮系統本身怎麼極致,會主動改造環境, 這是兩種哲學狀態。
那麼要開始D8需要提前準備哪些背景知識?怎麼建立工作環境:
背景知識:
1:面向對象開發模式,讓自己從過程式開發方式中轉變過來
2:了解php5.x各版本的差異,比如三元運算符的簡化形式?:、數組的簡化形式、運算結合性質等等,這些在php的官方網站有專門的升級頁面來介紹這些,在官網手冊附錄部分http://php.net/manual/zh/appendices.php,drupal裡面使用了很多新特性,如果不理解,在看代碼的時候會被老是打斷去查詢用法,每個開發者建議自備一個文檔去記錄常用的快速備查,比如什麼特性是在哪個版本開始的,自己對某技術難點的理解,在這裡建議大家查詢php語言本身的東西首先到php官方網站,如果查詢不能滿足再到其他地方搜索,官網目前很完善,信息也比較及時,我發現其他一些地方的信息是不完備甚至是錯誤的。
熟悉PHP標準庫 (SPL),比如drupal搜索主題、模塊等擴展時就用到了spl裡面的目錄疊代器
4:了解psr規範,很簡單,也很簡短,官方地址是http://www.php-fig.org/psr/
5:先學習composer,它是drupal的基石之一,是一個獨立的軟體,進行依賴管理,通過php的類文件自動加載機制產生類加載器,這個是drupal8程序啟動的第一件事情
6:學習symfony,地址是http://symfony.com/,其實開始不用精細的學習,並不是不了解他就不能理解drupal,但drupal是建立在它之上的,開始少許理解會對drupal的學習加速,對symfony深入學習可以在drupal學習的同時進行,學習drupal前先看一看symfony各組件的文檔,目前drupal8.1.9使用是的symfony2.8版本,symfony現在已經是symfony3.1版本了,很多棄用的東西可以不用理會,比如依賴注入組件的容器範圍Scope,這些在程序裡面有棄用提示
7:學習Twig,在drupal外獨立使用一下它,開始只需要知道使用方法即可,不需要去看程序代碼,它用到了編譯原理的知識,沒有這方面知識可能難於理解,關於編譯原理這一塊知識量很大,是專門的一個領域,以後可以慢慢研究。
8:了解一下軟體設計模式方面的知識,drupal裡面到處是設計模式,但不建議去買大部頭的書來學,百度一下,看一些小小的程序案列就能明白,太多的書把設計模式講複雜了,搞的人云里霧裡,反而打擾積極性,很多事情本不難,都是溝通惹的禍。
工具環境準備:
1:首先解決語言不通的問題,建議大家安裝「有道詞典」,它可以對瀏覽器劃詞翻譯,強迫自己多到英文的drupal官網去看,開始會不習慣,但慢慢的就習慣使用英語,越來越不需要翻譯軟體的輔助
2:找到合手的開發工具,我比較喜歡的是phpdesigner、phpstorm編輯軟體,和phpstudy環境軟體。
社區裡面有工具環境這方面的專門頁面,大家可以看一看
3:社區概況,資料查詢、規範
我的學習是這樣一個過程:先看一遍使用文檔,再看一遍api文檔、最後去讀代碼。一定不要一開始就試圖通過讀代碼來了解drupal,因為drupal太龐大,如果沒有一些概念的認識和架構的全局印象圖,會讓人承受不了,讀代碼最討厭的就是不能和開發者思維同步。
在看使用文檔的時候,推薦看一本書《Beginning-Drupal8》,Todd Tomlinson寫的,drupal中國站drupalchina.cn的站長龍馬已經組織翻譯了這本書,我也參加了這本書的翻譯,該書面向新手,比較淺顯,但能對drupal的使用看個大概,目前20160910官網(如無特別指出均是指英文的官網)正在進行文檔的重組,不知道重組後效果怎麼樣,所以對以後的文檔使用現在沒法分享,在這之前我看完了所有的文檔,印象是是這樣的:drupal各個版本間文檔有交叉混雜,沒有徹底分開,文檔均來源於社區,由很多個人寫成,詳細程度不一,排序也有點問題,甚至有些部分的排序是按照首字母來進行的,沒有照顧到學習心理問題,和主次問題,所以大家不要試圖去按次序閱讀所有的文檔,根據自己的實際情況、學習曲線和關注點跳躍式的去查詢閱讀。雖然不完善但整個社區的文檔還是不錯的,能解決大部分疑惑,沒有詳細資料的情況下代碼注釋會成為最後選擇,實在找不到可以先記錄下來,後面的讀代碼階段一定能理解,或者是諮詢他人,了解清楚使用和一些概念後就進入第二階段,讀api文檔,api文檔是自動從程序代碼的注釋中提取的,所以是能跟上新版本的節奏,這些文檔不長,短於第一階段的開發文檔,所以能快速閱讀建立程序運行印象,如果有不清楚的可以到社區發問,或是記錄下來在讀代碼階段一定會明白,比如很多新人就不明白模塊的文件夾名、info文件名、及裡面的name值有什麼區別,但看完擴展發現類後就好會豁然開朗,這給讀代碼帶來樂趣,一時不明白以後終將明白。
關於規範,這是一個很重要的話題,官網有詳細的文檔,裡面清晰的描述了文件命名、變量函數類命名、組織、提問怎麼提等等一系列規範,在進行開發之前一定是要了解的,這樣才能和社區協作,將來為社區提供模塊才能被接受,詳細的規範請大家去官網看,不守規範會被鄙視,無法使社區力量強大
關於查詢,官網的搜索功能都比較強大,但還得依仗大家的英語水平,才能提出準確的關鍵字,這也是為什麼我推薦大家看英文的官網,即使用翻譯軟體去看,因為那裡的資料最豐富,自己也能慢慢接受英語的使用。
這裡額外說一下,drupal官網分享的一些連結在國內打不開,原因大家都知道,甚至有時候drupal官網本身都打不開,這個時候大家可以使用vpn網絡,搜索一下有很多,找一個註冊帳號,每個月二三十塊錢解決,谷歌、Facebook等等就在眼前了
4:drupal運作框架,啟動邏輯
學習drupal先應該對它的整體架構及執行流程有宏觀上的了解,知道這個後,在後面的學習中就明確知道自己處於邏輯大廈的哪個地方,為什麼程序要這樣設計等等,現在來說一說這塊內容:
drupal8是建立在symfony開源框架之上的,drupal8.1.9使用的是symfony2.8,symfony是一款非常流行的框架,強調模塊化,由許多組件構成,組件可復用,相互獨立解耦,在symfony的官網首頁說symfony就是一個可復用的php組件集,我們可以將任何一個組件獨立的運用到自己的應用程式中來,在symfony官網裡面每一個組件都有獨立的文檔,這些組件有些被drupal8直接使用,有些根據D8自己的特性進行了修改,有些則沒有使用,可以說學習Drupal8你將也會順帶著學習完一款如此優秀的框架(symfony的作者Fabien Potencier法賓是個狂人,從94年就開始專注於web,模板引擎twig就是出自他手,對RFC文檔十分了解)。現在來看一下symfony的執行流程【收到請求》查找處理器》解析參數》執行處理器》產生響應】:這個流程是drupal的主流程,drupal8是在此基礎上細化的,symfony的執行流程是由它的http-kernel組件定義,symfony認為任何一個網站系統其實就是一個把請求轉換為響應的系統,所以以此為標準來設計了這個流程。drupal8的流程是建立在symfony流程之上進行細化的:
這個流程圖請下載pdf文檔放大看。
好了現在了解了drupal8的架構和執行流程,我們來看一看實際的程序代碼是怎麼開始的,她是怎麼執行的:
也可以說Drupal8是遵循mvc模式的,他有唯一的一個統一的入口,所有的請求被伺服器通過.htaccess配置轉接到index.php,一般需要一個漂亮的url的話需要開啟伺服器的重寫模塊,如果沒有則需要用查詢串的方式明確定義到這個文件上來,不管怎麼樣整個系統都是從這個文件開始執行的,下面談一下開始執行後它所做的事情:
1:調用composer自動生成的類加載器,它通過php的自動加載機制憑藉名字空間去包含include類文件,不必在程序代碼裡面手動包含,裡面已經配置好了系統基本的加載路徑等對應關係
2:啟動drupal處理核心,將請求對象傳給他,讓他將其轉換為響應頁面,然後發送給瀏覽器
3:完成請求,發送出頁面後,再做一些收尾的工作
簡單講就這麼幾步,核心工作集中在核心上,那麼核心如何工作?它其實做了兩大塊事情,先準備服務容器,也叫依賴注入容器,然後讓容器裡面的服務在http-kernel服務的流程控制下運作起來,相互作用產生響應,我們看一下drupal容器準備完成之前都做了什麼,是怎麼完成容器對象的,容器可以說是D8學習的重中之重,他是系統的中樞,這就是DrupalKernel.php在完成的事情,從名字可以看出它的drupal核心地位,可以打開core/lib/Drupal/Core/DrupalKernel.php看一看:
1:預置啟動環境,它加載基本的D8函數庫,並設置php有一個統一的運行環境,比如session配置、編碼檢查、錯誤報告、設置異常處理函數等等,都是在這個階段完成的
2:初始化設置,根據請求判斷是哪一個站點,(這裡說一下drupal8的多站點功能,它其實就是多個站點復用同一套程序代碼而已,而且僅此而已,從邏輯上講是獨立的網站,他們有自己獨立的資料庫,站點與站點並無關聯,這個和站群是有區別的),然後加載這個站點的配置文件,配置文件是require進系統裡面的,這可以看出可以在配置文件settings.php中進行程序編寫,甚至退出系統。然後判斷域名是否是被允許的域名
3:判斷系統是否已經安裝,如果系統尚未安裝的話轉向安裝程序。
4:如果已經安裝則啟動核心,在這個階段會先建立一個基本的容器,稱之為引導容器,它為後續工作提供資料庫連接和緩存支持,有這樣的準備之後才開始真正的初始化服務容器。
程序進入初始化服務容器階段,這裡有個注意事項:在drupal核心的lib下面(core\lib\Drupal)有兩個文件夾:組件Component、核心Core,很多初學者不知道為什麼要把庫分到這兩個類別裡面,他們的區別是核心裏面的程序是和drupal本身緊密聯繫的,沒有考慮給其他項目復用,而組件裡面的東西是由drupal社區開發但可以離開drupal獨立復用的,或者在symfony框架範圍內復用,這樣的安排適合管理代碼,協同開發。
容器初始化:
1:查找緩存中是否有有效的容器定義數據,如果有,直接使用它初始化容器
2:如果沒有緩存,去構建容器定義數據,編譯一個容器
3:初始化服務提供器來準備容器定義數據,加載核心和擴展的services.yml文件,同時加載服務提供器,擴展是通過擴展發現類來完成的,他使用spl的目錄疊代器和過濾疊代器去查找有效的info.yml文件
4:編譯容器,編譯容器就是在容器形成前有一次機會讓服務間相互作用和關聯(有些關聯是在定義服務參數時無法考慮到的)比如通過服務標籤將訪問檢查器註冊到訪問管理器裡面,這個屬於依賴注入組件的範疇,稱為編譯Pass
5:容器形成後附加一些外部合成對象進去,並把容器賦值給全局的Drupal類靜態儲存引用,以後就可以使用\Drupal:: getContainer取得容器,方便全局引用
6:容器已經形成了,將容器定義數據導出Dumper,存儲到緩存,以便下次請求提高性能
至此第一大塊的工作完成,後面開始容器裡面的服務互動過程, http-kernel開始運作