首页 >后端开发 >php教程 >构建Drupal 8模块:路由,控制器和菜单链接

构建Drupal 8模块:路由,控制器和菜单链接

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原创
2025-02-21 09:45:10186浏览

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 文件:

<code class="language-yaml">name: Drupal 8 Demo module
description: 'Demo module for Drupal 8 alpha11'
type: module
core: 8.x</code>

其中四个键值对中有三个你应该很熟悉(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 相邻)中。在这个文件中,我们可以有以下(简单的)路由定义:

<code class="language-yaml">name: Drupal 8 Demo module
description: 'Demo module for Drupal 8 alpha11'
type: module
core: 8.x</code>

第一行标志着为模块 demo 创建一个名为 demo 的新路由的开始(第一个是模块名称,第二个是路由名称)。在 path 下,我们指定此路由要注册的路径。在 defaults 下,我们有两件事:默认页面标题(_title)和 _content,它引用 DemoController 类上的一个函数。在 requirements 下,我们指定访问用户需要拥有的权限才能查看页面。您应该查阅此文档页面,了解此路由文件可以具有的更多选项。

现在,让我们创建我们的第一个名为 DemoController 的控制器,当用户请求此页面时,它将调用一个名为 demo() 的函数。

在模块目录中,创建一个名为 src/ 的文件夹,并在其中创建一个名为 Controller/ 的文件夹。这将是存储控制器类的地方。继续创建第一个:DemoController.php。

控制器以及我们稍后将看到的其他类的放置到 src/ 文件夹中是采用 PSR-4 标准的一部分。最初,我们必须创建一个更大的文件夹结构(PSR-0 标准),但现在有一个过渡阶段,两者都可以工作。因此,如果您仍然看到放置在名为 lib/ 的文件夹中的代码,那就是 PSR-0。

在我们的 DemoController.php 文件中,我们现在可以声明我们的类:

<code class="language-yaml">demo.demo:
  path: '/demo'
  defaults:
    _content: '\Drupal\demo\Controller\DemoController::demo'
    _title: 'Demo'
  requirements:
    _permission: 'access content'</code>

这是为了在页面上显示某些内容而需要做的最简单和最少的事情。在顶部,我们指定类命名空间,在下面我们声明类。

在 DemoController 类中,我们只有 demo() 函数,它返回一个类似 Drupal 7 的可渲染数组。没什么大不了的。我们现在所要做的就是清除缓存并导航到 https://www.php.cn/link/1a4a5f89e71e4bb9973355c964a950b4 Drupal 页面,上面打印着Hello World

菜单链接呢?

在 Drupal 7 中,当我们实现 hook_menu() 时,我们还可以将注册的路径添加到菜单中,以便在站点上显示菜单链接。这再次不再使用此钩子处理,而是使用 yml 文件将菜单链接定义为配置。

让我们看看如何创建一个显示在管理的“结构”菜单下的菜单链接。首先,我们需要在模块的根目录中创建一个名为 demo.menu_links.yml 的文件。在这个 yml 文件中,我们将定义菜单链接及其在站点现有菜单中的位置。为了实现我们设定的目标,我们需要以下内容:

<code class="language-php"><?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!'),
    );
  }
}</code>

我们再次有一个基于缩进的 yml 结构,我们首先为模块 demo 定义菜单链接的机器名称(demo)(就像我们对路由所做的那样)。接下来,我们有链接标题和说明,然后是此链接的父级(它应该放置的位置)以及它应该使用什么路由。

parent 的值是父菜单链接(附加其模块),要找到它,您需要在 *.menu_links.yml 文件中进行一些挖掘。我知道“结构”链接是在核心系统模块中定义的,因此通过查看 system.menu_links.yml 文件,我可以确定此链接的名称。

route_name 是我们要为此链接使用的路由的机器名称。我们之前定义了我们的。有了这个,您可以清除缓存并导航到 https://www.php.cn/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