核心要点
- 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 的可渲染数组。没什么大不了的。我们现在所要做的就是清除缓存并导航到 https://www.php.cn/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 是我们要为此链接使用的路由的机器名称。我们之前定义了我们的。有了这个,您可以清除缓存并导航到 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中文网其他相关文章!

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

Laravel的服务容器和服务提供商是其架构的基础。 本文探讨了服务容器,详细信息服务提供商创建,注册,并通过示例演示了实际用法。 我们将从OVE开始

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Dreamweaver Mac版
视觉化网页开发工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器