核心要點
.info.yml
文件。自定義和貢獻模塊文件夾現在直接位於根目錄 modules/
下,核心代碼則移動到單獨的 core/
文件夾中。 hook_menu()
函數,利用 Symfony2 組件。這涉及到將路由定義為配置,並在控制器中處理回調函數。模塊的路由文件 demo.routing.yml
創建在模塊根文件夾中。 hook_menu()
處理,而是作為配置在 yml 文件中聲明。在模塊根目錄中創建名為 demo.menu_links.yml
的文件來定義菜單鏈接及其在站點現有菜單中的位置。 請注意,由於本文撰寫時 Drupal 8 仍在開發中,部分代碼可能已過時。請參考我嘗試更新示例代碼並使其與最新 Drupal 8 版本兼容的代碼庫。
Drupal 8 引入了許多變化,力求使其與其他現代 PHP 框架保持一致。這意味著舊的 PHP 4 風格的過程式編程在很大程度上被面向對象架構所取代。為了實現這一點,在“Proudly Found Elsewhere”計劃下,Drupal 8 包含了並非專門為 Drupal 開發的代碼。
Drupal 最重要的補充之一是 Symfony 組件,這對 Drupal 開發人員帶來了兩大影響。首先,它有可能大大增加現在想要為 Drupal 開發的開發人員數量。其次,它讓一些缺乏現代 PHP 實踐經驗的 Drupal 7 開發人員感到有些擔憂。但這沒關係,我們都在學習,從 Symfony(以及希望是 Drupal 8)等框架中吸取的經驗,將很容易擴展並應用於其他 PHP 框架。
與此同時,Drupal 8 處於其發布週期的後期階段,本文撰寫時的當前版本為 alpha11。我們將使用此版本來展示 Drupal 7 開發人員首先會遇到並應該熟悉的模塊開發的一些基本變化。我設置了一個 Git 代碼庫,您可以在其中找到我在本系列中編寫的代碼,如果您願意,可以這樣跟隨學習。
我們要首先關注的是定義必要的文件夾結構和文件,以便讓 Drupal 8 了解我們的新模塊。在 Drupal 7 中,我們至少需要創建兩個文件(.info
和 .module
),但在 Drupal 8 中,前者的 YAML 版本就足夠了。是的,.info
文件現在被 .info.yml
文件取代,包含類似的數據,但結構不同。
另一個重大變化是,自定義和貢獻模塊文件夾現在直接進入根目錄 modules/
文件夾。這是因為所有核心代碼都已移動到其自身的單獨 core/
文件夾中。當然,在 modules/
目錄中,建議像在 Drupal 7 中一樣,將模塊分隔為自定義和貢獻。
讓我們創建一個名為 demo(非常原創)的模塊,並將其放在 modules/custom/
目錄中。正如我提到的,在這個新創建的 demo/
文件夾內,我們首先只需要一個包含以下所需內容的 demo.info.yml
文件:
name: Drupal 8 Demo module description: 'Demo module for Drupal 8 alpha11' type: module core: 8.x
其中四個鍵值對中有三個你應該很熟悉(name、description 和 core)。 type 現在也是一個必需項,因為你也可以為主題創建 yml 文件。另一個需要注意的重要事項是,yml 文件中的空格是有意義的,並且使用正確的縮進將數據組織成類似數組的結構。
您可以查看此文檔頁面,了解可以添加到模塊 .info.yml
文件中的其他鍵值對,以及宣布切換到此格式的更改說明。
就是這樣,一個文件。您現在可以導航到“擴展”頁面,找到 Demo 模塊並啟用它。
正如我提到的,在我們啟用模塊之前,不再需要創建 .module
文件。從架構上講,.module
文件的大小將大大減小,因為大部分業務邏輯將移動到服務類、控制器和插件中,但我們稍後會看到其中的一些內容。
hook_menu()
及其回調函數發生了什麼? 在 Drupal 7 中,hook_menu()
可能是實現最多的鉤子,因為它用於定義 Drupal 的路徑並將這些路徑與回調函數連接起來。它還負責創建菜單鏈接和許多其他內容。
在 Drupal 8 中,我們不再需要 hook_menu()
,因為我們大量使用 Symfony2 組件來處理路由。這涉及到將路由定義為配置,並在控制器(控制器類的函數)中處理回調函數。讓我們看看如何通過創建一個輸出經典 Hello world! 的簡單頁面來實現這一點。
首先,我們需要為我們的模塊創建一個名為 demo.routing.yml
的路由文件。此文件位於模塊根文件夾(與 demo.info.yml
相鄰)中。在這個文件中,我們可以有以下(簡單的)路由定義:
name: Drupal 8 Demo module description: 'Demo module for Drupal 8 alpha11' type: module core: 8.x
第一行標誌著為模塊 demo 創建一個名為 demo 的新路由的開始(第一個是模塊名稱,第二個是路由名稱)。在 path 下,我們指定此路由要註冊的路徑。在 defaults 下,我們有兩件事:默認頁面標題(_title
)和 _content
,它引用 DemoController 類上的一個函數。在 requirements 下,我們指定訪問用戶需要擁有的權限才能查看頁面。您應該查閱此文檔頁面,了解此路由文件可以具有的更多選項。
現在,讓我們創建我們的第一個名為 DemoController 的控制器,當用戶請求此頁面時,它將調用一個名為 demo() 的函數。
在模塊目錄中,創建一個名為 src/ 的文件夾,並在其中創建一個名為 Controller/ 的文件夾。這將是存儲控制器類的地方。繼續創建第一個:DemoController.php。
控制器以及我們稍後將看到的其他類的放置到 src/ 文件夾中是採用 PSR-4 標準的一部分。最初,我們必須創建一個更大的文件夾結構(PSR-0 標準),但現在有一個過渡階段,兩者都可以工作。因此,如果您仍然看到放置在名為 lib/ 的文件夾中的代碼,那就是 PSR-0。
在我們的 DemoController.php 文件中,我們現在可以聲明我們的類:
demo.demo: path: '/demo' defaults: _content: '\Drupal\demo\Controller\DemoController::demo' _title: 'Demo' requirements: _permission: 'access content'
這是為了在頁面上顯示某些內容而需要做的最簡單和最少的事情。在頂部,我們指定類命名空間,在下面我們聲明類。
在 DemoController 類中,我們只有 demo() 函數,它返回一個類似 Drupal 7 的可渲染數組。沒什麼大不了的。我們現在所要做的就是清除緩存並導航到 //m.sbmmt.com/link/1a4a5f89e71e4bb9973355c964a950b4 Drupal 頁面,上面打印著Hello World。
在 Drupal 7 中,當我們實現 hook_menu()
時,我們還可以將註冊的路徑添加到菜單中,以便在站點上顯示菜單鏈接。這再次不再使用此鉤子處理,而是使用 yml 文件將菜單鏈接定義為配置。
讓我們看看如何創建一個顯示在管理的“結構”菜單下的菜單鏈接。首先,我們需要在模塊的根目錄中創建一個名為 demo.menu_links.yml
的文件。在這個 yml 文件中,我們將定義菜單鏈接及其在站點現有菜單中的位置。為了實現我們設定的目標,我們需要以下內容:
<?php /** * @file * Contains \Drupal\demo\Controller\DemoController. */ namespace Drupal\demo\Controller; /** * DemoController. */ class DemoController { /** * Generates an example page. */ public function demo() { return array( '#markup' => t('Hello World!'), ); } }
我們再次有一個基於縮進的 yml 結構,我們首先為模塊 demo 定義菜單鏈接的機器名稱(demo)(就像我們對路由所做的那樣)。接下來,我們有鏈接標題和說明,然後是此鏈接的父級(它應該放置的位置)以及它應該使用什麼路由。
parent 的值是父菜單鏈接(附加其模塊),要找到它,您需要在 *.menu_links.yml 文件中進行一些挖掘。我知道“結構”鏈接是在核心系統模塊中定義的,因此通過查看 system.menu_links.yml 文件,我可以確定此鏈接的名稱。
route_name 是我們要為此鏈接使用的路由的機器名稱。我們之前定義了我們的。有了這個,您可以清除緩存並導航到 //m.sbmmt.com/link/6c2665d7c3ed1e5bfd8ba600f026eb55 demo/ 路徑。不錯。
在本文中,我們開始探索 Drupal 8 中的模塊開發。在這個階段(alpha11 版本),是時候開始學習如何使用新的 API 和移植貢獻模塊了。為此,我正在書寫我對這個新的令人興奮的框架(Drupal 8)的探索,以便我們都能學習這些變化,並在發布日到來時立即投入工作。
首先,我們了解了一些基礎知識:如何啟動 Drupal 8 模塊(文件、文件夾結構等),並將其與 Drupal 7 進行比較。我們還了解瞭如何定義路由和一個控制器類,以及如何通過此路由調用一個函數。最後,我們看到瞭如何創建一個使用我們定義的路由的菜單鏈接。
在下一個教程中,我們將繼續構建此模塊,並了解 Drupal 8 使用的其他一些很酷的新功能。我們將了解如何創建塊以及如何使用表單和配置系統。到時候見。
Drupal 8 模塊本質上是一組包含某些功能的文件,並以特定方式構建。基本結構包括一個.info.yml
文件(提供有關模塊的元數據)、一個.module
文件(包含PHP 代碼)以及其他可選文件,例如.css
、.js
、.twig
等,用於附加功能。 .info.yml
文件是強制性的,它定義了模塊的名稱、描述、包、類型、核心和依賴項。
Drupal 8 中的路由系統負責將 URL 映射到特定的控制器類。它使用 Symfony 的路由組件,該組件允許靈活且強大的系統。路由系統使用 routing.yml
文件來定義具有唯一名稱、路徑、默認值和要求的路由。默認值通常指定負責處理請求的控制器類。
在 Drupal 8 中創建自定義頁面涉及定義路由和控制器。路由在 routing.yml
文件中定義,並將 URL 映射到控制器。控制器是一個 PHP 類,它為頁面內容返回一個渲染數組。控制器類應放在模塊的 src/Controller
目錄中。
將菜單鏈接添加到您的自定義頁面涉及在您的模塊中創建一個 links.menu.yml
文件。此文件定義了菜單鏈接,其屬性包括標題、描述、父級、路由名稱和權重。路由名稱應與 routing.yml
文件中定義的路由名稱匹配。
在 Drupal 8 中創建表單涉及創建一個擴展 FormBase
類並實現 FormInterface
的表單類。此類定義表單元素、驗證和提交處理。可以通過從控制器返回表單來顯示表單。
在 Drupal 8 中創建塊涉及創建一個擴展 BlockBase
類的塊類。此類定義塊內容和其他屬性。可以通過塊佈局界面將塊放置在頁面上。
創建配置表單涉及創建一個擴展 ConfigFormBase
類並實現 FormInterface
的表單類。此類定義表單元素並處理配置數據的保存和加載。
創建管理頁面涉及定義一條路徑在 /admin
下的路由和一個返回頁面內容的渲染數組的控制器。可以通過定義一個在 system.admin
下具有父級的菜單鏈接將頁面添加到管理菜單中。
在 Drupal 8 中創建主題涉及創建一個 .info.yml
文件,該文件定義名稱、描述、類型、核心和基本主題。可以添加其他 .twig
、.css
和 .js
文件來為各個元素設置主題。
創建自定義字段類型涉及創建一個擴展 FieldTypePluginBase
類的字段類型類。此類定義字段屬性以及用於存儲、顯示和表單處理的方法。字段類型可用於內容類型、用戶、評論和其他實體。
以上是構建Drupal 8模塊:路由,控制器和菜單鏈接的詳細內容。更多資訊請關注PHP中文網其他相關文章!