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