隨著 php5 面向對象的完善,現在很多php主流框架都往面向對象發展。Drupal8為了適應新php主題框架的需要,也將用面向對象的方式取代面向過程,在Proudly Found Elsewhere的倡議下,Dupal8包含了很多看起來不像是為了drupal開發的的代碼。
其中最大的變化是引入了Symfony框架,這對開發人員來說,會產生兩個重大影響
首先,這可能將會大大增加Drupal開發者的數量,比如那些曾經自認為是大師,不屑于面向過程開發的傳統"高端程序猿",現在Drupal8,也是面向對像了,也用了新框架,他們已經沒有理由拒絕加入drupal開發者的行列
第二,新的框架內核變化,會給現在那些沒有多少PHP現代框架開發經驗的人許多恐懼,他們會擔心自己不能適應這種開發方式的巨大轉變,但是沒關系,我們都需要重新學習,學習Symfony框架,還有充滿希望的Drupal8, 像其他PHP框架一樣,它們都是很容易擴展的,我們要給自己信心。
在目前,Drupal 8 還在其發布周期中,目前最新的版本是alpha12,我們會基于這個版本,來展示一些Drupal 7開發者會先遇到的一些基本變化,我們應該先熟悉這些基本變化。
我怎樣創建一個模塊?
我們第一件事是要確定必須的文件和文件夾結構來告訴Drupal8識別我們的新模塊。在Drupal 7 里,我們必須創建至少2個文件(.info 和 .module文件),但是在Drupal 8里,.info文件替換成了.info.yml,文件里的內容數據信息相同,但格式略有差異。
另一個主要變化是,自定義模塊和第三方貢獻模塊文件夾的存放位置現在被放到了根目錄下的modules/,這是因為所有核心的代碼已經被移動到了它單獨的文件夾core/,當然,在根目錄下的modules文件夾內,我們依然鼓勵你像以往的Drupal 7 一樣,可以創建 custom 和contrib 子文件夾來分別存放你的自定義模塊和官網下載的第三方模塊。
讓我們繼續,我們現在先來學習創建一個叫demo(非常簡單)的模塊,并把它放到modules/custom/文件夾下,正如我之前所提到的,我們需要在這個新創建的demo/文件夾里,創建一個 demo.info.yml 文件,并在文件里輸入以下代碼:
- name: Drupal 8 Demo module
- description: 'Demo module for Drupal 8 alpha12'
- type: module
- core: 8.x
這些大部分你應該看著很熟悉吧(name, description and core), type 字段也是現在必須有的一項,它的值可以是module,theme,theme_engine分別定義此文件類型是模塊,還是主題或者模板引擎,另外要注意的一件重要的細節是,注意yml文件里的空格,正確縮進可以像數組一樣組織數據。
你可以查看此文檔 (https://www.drupal.org/node/2000204)說里其他可用的key|value , 然后打開一個模塊文件夾下的.info.yml文件,嘗試改變key|value,這里是官方的變更說明 (https://www.drupal.org/node/1935708)
現在,只要有這一個文件就足夠了,你可以進入導航菜單下的Extend(擴展)頁,找到Demo模塊,并啟用它。
正如我之前提到的,現在我不需要再創建一個.module的文件,drupal 8就已經可以識別此模塊了,因為在drupal 8里,.module文件已經不再是必須存在的文件。因為現在大部分的業務邏輯代碼都轉移到了service類,控制器和插件里,我們稍后會看到這一點。
什么是路由?調用hook_menu()會發生什么?它的回調怎么工作?
在drupal 7里,hook_menu()可能是最能實現這些功能需求的鉤子,因為它就是被用于設定路徑并且把這些路徑和回調函數連接起來,它也用來創建菜單鏈接和其他一些東西
在Drupal 8里,我們不再需要hook_menu()了,因為我們會大量使用Symfony2的組件來處理路由,這涉及定義一個路由配置和在控制器里處理一個回調(Controller類的方法), 讓我們來實際看下它是如何工作的,我們來創建一個簡單的頁面來輸出那句程序界的永恒經典:Hello world!
首先,我們需要為我們的模塊創建一個路由文件:demo.routing.yml ,這個文件也是放在demo模塊根目錄下,在這個文件里,我們可以有如下(簡單)路由設定:
- demo.demo:
- path: '/demo'
- defaults:
- _content: 'DrupaldemoControllerDemoController::demo'
- _title: 'Demo'
- requirements:
- _permission: 'access content'
第一行代碼是一個新路由的開始,這個路由的名字叫做demo(原作者真蛋疼,你就不能取一個不一樣的路由名嘛,非要和模塊名一樣,你讓我的小伙伴誤會了怎么辦?),第一個是demo是模塊名,第二個demo是路由名.
第二行path, 我們指定了這個路由的注冊路徑。
第三行defaults默認設置,我們設定了兩件事:默認的頁面標題(_title)和引用一個DemoController類的一個方法(_content)
第四行requirements要求,我們指定了用戶需要有什么權限才能查看該頁面。
你可以查此文檔 (https://www.drupal.org/node/2092643)知道你還可以在這個路由文件里設定哪些選項。
現在,讓我們來創建第一個叫做DemoController的控制器,并且它包含了一個方法叫做:demo(),用于當用戶訪問該頁面時調用此方法。
在模塊目錄里,創建一個src的文件夾和一個Controller的文件夾,這就是我們存放controller類的地方,好了,進入Controller文件夾,創建文件:DemoController.php。
該控制器的位置,正如我們將看到的一樣,把其他類放入src文件夾里是采用PSR-4標準的一部分,在之前,我們有一個更深層更大的文件夾結構(PSR-0標準),但現在有一個過渡階段,這兩種標準的文件夾結構路徑都會起作用,所以你如果看到代碼類仍然被放在lib/文件夾下,不用覺得奇怪,那是PSR-0標準。
在DemoController.php文件里,我們可以聲明我們的類了:
- <?php
- /**
- * @file
- * Contains DrupaldemoControllerDemoController.
- */
- namespace DrupaldemoController;
- /**
- * DemoController.
- */
- class DemoController {
- /**
- * Generates an example page.
- */
- public function demo() {
- return array(
- '#markup' => t('Hello World!'),
- );
- }
- }
- ?>
這是我們為了在一個頁面上顯示"Hello World!"的一個結構最簡單的實例,在頂部,我們指定了類的命名空間,在下面,我們聲明了我們的類
在DemoController類里,我們只需要demo()方法,用來返回一個像以往的drupal 7里一樣的渲染數組,沒有大量的東西,現在我們要做的就是清空緩存,并在瀏覽器里輸入地址:http://example.com/demo ,然后我們就應該可以看到一個輸出有Hello World!的頁面!
怎么創建菜單鏈接?
在Drupal 7里,為了讓菜單鏈接顯示在網站上,我們可以在實施hook_menu()時,添加已經注冊過的路徑,但在Drupal8里,這個不再需要用hook來處理,我們可以像配置一樣使用一個yml文件來聲明菜單鏈接
讓我們來看看,該怎樣創建一個菜單鏈接來顯示在Structure(結構)管理菜單下,首先,我們在我們的模塊根目錄下創建一個demo.menu_links.yml 文件,在這個文件中,我們將設定菜單鏈接和在現有網站菜單上的位置,為了實現我們所要做的,我們需要在文件里輸入以下代碼:
- demo.demo:
- title: Demo Link
- description: 'This is a demo link'
- parent: system.admin_structure
- route_name: demo.demo
這又是一個基于縮進的yml結構文件,第一行我們定義了模塊的菜單鏈接的機器名(就像之前定義路由一樣),接下來,我們設定了鏈接的標題,描述,父菜單路徑(作為子菜單放在該父菜單下),以及該菜單關聯的路由名。
父菜單選項的值是父菜單路徑(通它的所屬模塊附加),你想找個這個父菜單鏈接,你需要查找一些類似的*.menu_links.yml文件,因為這里的值是system.admin_structure,所以我就可以知道,它肯定是由核心的System模塊設定的,所以你就可以判斷這個父菜單鏈接存在于system.menu_links.yml文件里。
route_name是我們想要為這個菜單關聯的路由名(這們之前創建的),當你清空緩存后,然后輸入瀏覽器地址:http://example.com/admin/structure你應該可以看到一個新的菜單標題和描述,并且此鏈接是鏈接到demo/path的,怎么樣,很不錯吧?
結論:在這篇文章中,我們開始討論Drupal 8 的模塊開發,在這個階段(alpha12發布),正是開始學習怎樣使用新的API接口來開發貢獻模塊,為此,我會大家一起退出傳統框架的思維,用全新的思維一起探索學習Drupal 8的變化。
首先,我們了解了一些基礎知識,如何啟動一個Drupal8模塊(文件和文件夾結構等),所有這些與Drupal 7的不同之處,我們還看到了如何設定路由和一個控制器類的方法來調用一個路由地址,最后,我們已經看到了如何創建一個使用我們所定義路由的菜單鏈接。
在接下來的教程中,我們將繼續構建完善這個模塊,并期待發現在Drupal8中其他一些很酷的東西,我們將看到我們如何創建區塊和如何配合使用表單和配置管理系統,下期見。
新聞熱點
疑難解答