首頁 > 後端開發 > php教程 > 構建Drupal 8模塊:路由,控制器和菜單鏈接

構建Drupal 8模塊:路由,控制器和菜單鏈接

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-02-21 09:45:10
原創
187 人瀏覽過

Build a Drupal 8 Module: Routing, Controllers and Menu Links

核心要點

  • Drupal 8 從過程式編程轉向面向對象架構,並通過“Proudly Found Elsewhere”計劃整合了其他來源的代碼,其中包括 Symfony 組件等重要補充。
  • 創建 Drupal 8 模塊需要定義必要的文件夾結構和文件,例如 .info.yml 文件。自定義和貢獻模塊文件夾現在直接位於根目錄 modules/ 下,核心代碼則移動到單獨的 core/ 文件夾中。
  • Drupal 8 中的“路由”取代了 Drupal 7 中的 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 模塊的常見問題解答 (FAQ)

Drupal 8 模塊的基本結構是什麼?

Drupal 8 模塊本質上是一組包含某些功能的文件,並以特定方式構建。基本結構包括一個.info.yml 文件(提供有關模塊的元數據)、一個.module 文件(包含PHP 代碼)以及其他可選文件,例如.css.js.twig 等,用於附加功能。 .info.yml 文件是強制性的,它定義了模塊的名稱、描述、包、類型、核心和依賴項。

Drupal 8 中的路由系統如何工作?

Drupal 8 中的路由系統負責將 URL 映射到特定的控制器類。它使用 Symfony 的路由組件,該組件允許靈活且強大的系統。路由系統使用 routing.yml 文件來定義具有唯一名稱、路徑、默認值和要求的路由。默認值通常指定負責處理請求的控制器類。

如何在 Drupal 8 中創建自定義頁面?

在 Drupal 8 中創建自定義頁面涉及定義路由和控制器。路由在 routing.yml 文件中定義,並將 URL 映射到控制器。控制器是一個 PHP 類,它為頁面內容返回一個渲染數組。控制器類應放在模塊的 src/Controller 目錄中。

如何在我的 Drupal 8 自定義頁面中添加菜單鏈接?

將菜單鏈接添加到您的自定義頁面涉及在您的模塊中創建一個 links.menu.yml 文件。此文件定義了菜單鏈接,其屬性包括標題、描述、父級、路由名稱和權重。路由名稱應與 routing.yml 文件中定義的路由名稱匹配。

如何在 Drupal 8 中創建表單?

在 Drupal 8 中創建表單涉及創建一個擴展 FormBase 類並實現 FormInterface 的表單類。此類定義表單元素、驗證和提交處理。可以通過從控制器返回表單來顯示表單。

如何在 Drupal 8 中創建塊?

在 Drupal 8 中創建塊涉及創建一個擴展 BlockBase 類的塊類。此類定義塊內容和其他屬性。可以通過塊佈局界面將塊放置在頁面上。

如何在 Drupal 8 中創建配置表單?

創建配置表單涉及創建一個擴展 ConfigFormBase 類並實現 FormInterface 的表單類。此類定義表單元素並處理配置數據的保存和加載。

如何在 Drupal 8 中創建管理頁面?

創建管理頁面涉及定義一條路徑在 /admin 下的路由和一個返回頁面內容的渲染數組的控制器。可以通過定義一個在 system.admin 下具有父級的菜單鏈接將頁面添加到管理菜單中。

如何在 Drupal 8 中創建主題?

在 Drupal 8 中創建主題涉及創建一個 .info.yml 文件,該文件定義名稱、描述、類型、核心和基本主題。可以添加其他 .twig.css.js 文件來為各個元素設置主題。

如何在 Drupal 8 中創建自定義字段類型?

創建自定義字段類型涉及創建一個擴展 FieldTypePluginBase 類的字段類型類。此類定義字段屬性以及用於存儲、顯示和表單處理的方法。字段類型可用於內容類型、用戶、評論和其他實體。

以上是構建Drupal 8模塊:路由,控制器和菜單鏈接的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板