Drupal 8 之後架構調整與插入 PHP 程式碼的實現方法

2025-05-02

標籤: 心得分享

廣告

Drupal 8 引入了顯著的架構變革,採用了 Symfony 框架並強化了物件導向程式設計(OOP)原則。這些改變提升了 Drupal 的安全性、可維護性和現代化程度,但也帶來了一些限制,其中最顯著的是無法直接在文章或區塊中插入 PHP 程式碼。本文將探討 Drupal 8 及後續版本(包括 Drupal 9 和 10)的架構調整,解釋為何禁止直接插入 PHP 程式碼,以及如何以安全且符合 Drupal 標準的方式實現 PHP 程式碼的插入。

Drupal 8 及後續版本的架構調整

1. 採用 Symfony 框架

Drupal 8 放棄了 Drupal 7 的自定義架構,轉而整合 Symfony,這是一個廣受認可的 PHP 框架。Symfony 提供了更結構化的 MVC(模型-視圖-控制器)模式,使 Drupal 的核心代碼更模組化並易於測試。主要變革包括: - 依賴注入(Dependency Injection):服務容器管理核心功能,減少硬編碼依賴。 - 路由系統:取代 Drupal 7 的 hook_menu,使用 YAML 配置文件定義路由。 - Twig 模板引擎:取代 PHP 模板,強制分離邏輯與呈現層,提升安全性。

2. 移除 PHP 濾鏡

在 Drupal 7 中,管理員可以通過啟用「PHP 濾鏡」模組,直接在文章、區塊或其他內容中嵌入 PHP 程式碼。然而,這種做法存在嚴重的安全風險,因為未經嚴格過濾的 PHP 程式碼可能導致跨站腳本攻擊(XSS)或其他漏洞。從 Drupal 8 開始,核心不再包含 PHP 濾鏡模組,徹底禁止在內容編輯器中直接插入 PHP 程式碼。主要原因包括: - 安全性:直接執行用戶輸入的 PHP 程式碼可能導致惡意代碼執行,危害網站安全。 - 最佳實踐:Drupal 8 鼓勵使用模組或主題來實現自定義邏輯,而不是在內容中嵌入程式碼。 - 現代化開發:Symfony 和 Twig 的引入要求更結構化的程式碼管理方式,減少對內嵌 PHP 的依賴。

3. 強化安全與模組化

Drupal 8 及後續版本採用了更嚴格的權限控制和輸入過濾機制,確保內容創建者無法繞過安全限制執行程式碼。此外,模組化設計鼓勵開發者通過自定義模組或主題實現功能,而不是依賴內容層的程式碼插入。

為何無法隨意插入 PHP 程式碼

在 Drupal 8 及以上版本中,無法直接在文章或區塊中插入 PHP 程式碼的原因如下: - Twig 模板的限制:Twig 是一種安全模板引擎,僅允許預定義的變數和函數,禁止直接執行 PHP 程式碼。 - 移除 PHP 濾鏡模組:Drupal 核心不再支援 PHP 濾鏡,且官方強烈不建議使用第三方 PHP 執行模組。 - 內容與邏輯分離:Drupal 8 強調將業務邏輯放在模組或服務中,而非內容編輯器中,確保代碼可維護且可測試。 - 安全風險:允許非開發者直接插入 PHP 程式碼可能導致安全漏洞,特別是在多用戶環境中。

如何在 Drupal 8 及以上版本中實現 PHP 程式碼插入

雖然直接在內容中插入 PHP 程式碼被禁用,但 Drupal 提供了多種安全且符合標準的方式來實現自定義邏輯。以下是幾種推薦的實現方法:

1. 創建自定義模組

自定義模組是 Drupal 8 及以上版本中實現 PHP 邏輯的首選方式。通過模組,開發者可以在後端執行複雜邏輯,並將結果傳遞到前端顯示。

步驟:

  1. 創建模組結構
  2. modules/custom 目錄下創建一個新模組,例如 my_custom_module
  3. 創建 my_custom_module.info.yml 文件: yaml name: My Custom Module type: module description: A custom module to execute PHP logic. core_version_requirement: ^8 || ^9 || ^10
  4. 定義控制器或服務
  5. 創建 src/Controller/MyCustomController.php: ```php namespace Drupal\my_custom_module\Controller;

    use Drupal\Core\Controller\ControllerBase;

    class MyCustomController extends ControllerBase { public function content() { $output = 'This is dynamic content from PHP!'; // 在此處添加自定義 PHP 邏輯 return [ '#markup' => $output, ]; } } 3. **定義路由**: - 創建 `my_custom_module.routing.yml`:yaml my_custom_module.content: path: '/my-custom-content' defaults: _controller: '\Drupal\my_custom_module\Controller\MyCustomController::content' _title: 'Custom Content' requirements: _permission: 'access content' `` 4. **啟用模組**: - 執行drush en my_custom_module -y啟用模組。 5. **顯示內容**: - 訪問/my-custom-content` 查看結果,或通過區塊或視圖嵌入內容。

優點:

  • 符合 Drupal 標準,安全且可維護。
  • 支援複雜邏輯和資料庫操作。
  • 易於版本控制和部署。

2. 使用自定義區塊

對於需要在特定頁面顯示動態內容的情況,可以創建自定義區塊來執行 PHP 程式碼。

步驟:

  1. 創建模組
  2. 同上,創建一個自定義模組。
  3. 定義自定義區塊
  4. 創建 src/Plugin/Block/CustomBlock.php: ```php namespace Drupal\my_custom_module\Plugin\Block;

    use Drupal\Core\Block\BlockBase;

    / * Provides a custom block with PHP logic. * * @Block( * id = "custom_block", * admin_label = @Translation("Custom PHP Block") * ) */ class CustomBlock extends BlockBase { public function build() { $output = 'Dynamic block content from PHP!'; // 在此處添加自定義 PHP 邏輯 return [ '#markup' => $output, ]; } } ``` 3. 啟用模組並放置區塊**: - 啟用模組後,前往「結構 > 區塊佈局」,將自定義區塊放置到所需區域。

優點:

  • 適合簡單的動態內容展示。
  • 可通過 Drupal 的區塊系統靈活配置。

3. 使用 Twig 模板與預處理函數

如果只需要在前端顯示動態內容,可以通過自定義主題和 Twig 模板實現。

步驟:

  1. 創建自定義主題或子主題
  2. themes/custom 中創建主題,定義 my_theme.info.yml
  3. 添加預處理函數
  4. my_theme.theme 文件中添加預處理邏輯: php function my_theme_preprocess_node(&$variables) { $node = $variables['node']; $variables['custom_data'] = 'Dynamic PHP data for node ' . $node->id(); // 在此處添加自定義 PHP 邏輯 }
  5. 在 Twig 模板中使用
  6. 編輯 templates/node.html.twigtwig <div> {{ custom_data }} </div>

優點:

  • 保持邏輯與呈現分離。
  • 適合需要動態調整前端顯示的情況。

4. 使用現有模組(如 Views 或 Paragraphs)

對於非開發者,可以使用以下模組來實現類似 PHP 的動態功能: - Views:通過自定義視圖和字段格式化,實現動態內容展示。 - Paragraphs:允許內容編輯者通過結構化組件創建複雜內容。 - Rules:用於實現條件邏輯和自動化任務,部分替代簡單的 PHP 腳本。

限制:

  • 這些模組無法完全取代複雜的 PHP 邏輯,適合簡單場景。

5. 避免使用 PHP 濾鏡模組

雖然存在第三方模組(如 php 模組)試圖恢復 PHP 濾鏡功能,但官方強烈不建議使用,因為: - 安全風險高,可能導致網站被攻擊。 - 不符合 Drupal 8 及以上版本的開發最佳實踐。 - 可能與核心更新不相容。

最佳實踐

  • 優先使用模組:將 PHP 邏輯封裝在自定義模組中,確保代碼可重用且安全。
  • 遵循 Drupal 標準:使用控制器、服務和插件系統,避免直接操作資料庫。
  • 版本控制:將自定義模組代碼納入 Git,方便維護和部署。
  • 測試環境:在開發或測試環境中測試自定義邏輯,避免直接在生產環境修改。
  • 權限控制:確保只有受信任的開發者能夠修改代碼或模組配置。

結論

Drupal 8 及後續版本的架構調整通過引入 Symfony 和 Twig,提升了網站的安全性與可維護性,但也禁止了在文章或區塊中直接插入 PHP 程式碼。這一改變迫使開發者採用更結構化、更安全的方式來實現自定義邏輯。通過創建自定義模組、自定義區塊或利用 Twig 模板,開發者可以在不犧牲安全性的前提下實現幾乎所有的 PHP 功能需求。對於 Drupal 站長和開發者來說,適應這些新方法不僅能提升網站品質,還能更好地遵循現代化 Web 開發的最佳實踐。

資源

  • Drupal 官方文件:https://www.drupal.org/docs/developing
  • Symfony 框架入門:https://symfony.com/doc/current/index.html
  • Twig 模板指南:https://twig.symfony.com/doc/3.x/
  • Drupal 模組開發教程:https://www.drupal.org/docs/creating-custom-modules
廣告