滚动
在 Drupal 模块中以编程方式创建页面
在 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 的。它必须返回一个可渲染数组。