logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

在 Drupal 模块中以编程方式创建页面

04/10/2025, by Ivan

在 Drupal 中创建一个简单页面有两个步骤:

声明路径及其参数。

此步骤包括页面标题、访问页面的权限要求等。

在 Drupal 7 中,你需要实现 hook_menu()。

在 Drupal 8 中,你需要在模块顶层目录下创建 <module_name>.routing.yml 文件。

编写代码以返回页面主体。

在 Drupal 7 中,你需要编写在 hook_menu() 中指定的页面回调函数。

在 Drupal 8 中,页面回调必须是类的方法或已注册的服务。它可以根据不同条件(HTTP 或 HTTPS、内容头等)有所不同,但这超出了本介绍的范围。

流程

按照本页的示例,你就能在自定义模块中创建一个简单的页面,而无需深入了解 Drupal 的内部机制。更多详细信息请参阅 变更记录,其中介绍了路由系统的更改以及核心和示例项目中的不同实现。

示例模块的路由 YAML 文件

路由信息存储在 example/example.routing.yml 文件中:

example.my_page:
  path: '/mypage/page'
  defaults:
    _controller: '\Drupal\example\Controller\ExampleController::myPage'
    _title: 'My first page in D8'
  requirements:
    _permission: 'access content'

example.my_page

  • 这是路由的机器名。按照约定,路由机器名应为 module_name.sub_name。当代码的其他部分需要引用该路由时,它们会使用这个机器名。

path

  • 这是页面在你网站上的路径。请注意开头的斜杠 (/)。

defaults

  • 这里描述了页面回调和标题回调。@todo: 这些默认值在哪里可以被覆盖?

requirements

  • 这里定义了显示页面的条件。你可以指定权限、必须启用的模块以及其他条件。

示例模块的页面实现

Controller 类 ExampleController 应该定义在 example/src/Controller/ExampleController.php 文件中:

<?php
namespace Drupal\example\Controller;

use Drupal\Core\Controller\ControllerBase;

/**
 * 为 Example 模块提供路由响应。
 */
class ExampleController extends ControllerBase {

  /**
   * 返回一个简单页面。
   *
   * @return array
   *   一个可渲染数组。
   */
  public function myPage() {
    $element = array(
      '#markup' => 'Hello, world',
    );
    return $element;
  }

}

命名空间 (namespace)

  • 这里声明了前缀,用于完整定义我们要创建的类名。请比较文档块和类名。类的自动加载器知道,要查找 \Drupal\example\Controller\ExampleController 类,它需要在 modules/example/src/Controller/ExampleController.php 文件中查找。

use

  • 这允许我们使用 ControllerBase 而不是完整限定名。这使我们的 class 声明更简洁易读。

myPage()

  • 在 YAML 文件中指定的方法必须是 public 的。它必须返回一个可渲染数组。