
使用 JSON:API 进行 CRUD 操作的身份验证
在与 JSON:API 交互时,可使用 Postman 或 cURL 等工具发送请求。默认情况下,这些请求会被视为来自“匿名用户”,因为这些工具本身并不处理身份认证。因此,根据你在 Drupal 站点中为匿名用户配置的权限,可能无法访问某些资源。
但如果你的目标是通过 JSON:API 执行创建、更新或删除(CRUD)操作,仅依赖匿名访问是远远不够的。这些操作需要经过身份验证的访问。Drupal 支持多种身份验证方式,可通过核心或贡献模块启用。
最常用的一种方式是 HTTP Basic Authentication,它包含在 Drupal 核心中。对于更高级的用例,也可以使用 Drupal REST & JSON API Authentication 模块,它提供了更强大的身份验证功能和自定义选项,便于你根据应用需求调整安全模型。
进行认证请求的步骤


我们经常会遇到 500 错误页面,尤其当 Drupal、服务或其他站点不可用时。出现 500(或 501-504)错误页面时,Drupal 会通过异常(Exceptions)来处理关键代码错误。例如在向其他网站发起 HTTP 请求时发生错误,Drupal 会显示类似如下的错误信息:“网站遇到意外错误,请稍后再试”:

在你的网站上出现 WSOD(白屏死机)并不好,因此我们来优化这个页面,改为展示一个有样式的 HTML 页面。


有时你需要在站点上设置固定的、永久性的分类(Categories),这些分类不应被意外修改。在这种情况下,你可以利用自定义代码和事件订阅器(Event Subscriber)来实现。
我们将在自定义模块中添加一个新的 Event Subscriber 类。
drupalbook_custom.services.yml
services:
drupalbook_custom.tag_redirect_subscriber:
class: Drupal\drupalbook_custom\EventSubscriber\TagRedirectSubscriber
arguments:
- '@entity_type.manager'
- '@current_user'
tags:
- { name: event_subscriber }
然后在 drupalbook_custom/src/EventSubscriber/TagRedirectSubscriber 中添加我们的事件订阅器类:


PHP 8 引入了 构造函数属性提升(constructor property promotion)功能,它通过允许你在构造函数签名中声明和初始化属性,从而简化了类属性的定义与赋值过程。本教程演示了如何在 Drupal 自定义模块中使用构造函数属性提升(需要 PHP 8.0 及以上),特别是用于简化服务和控制器中的依赖注入。我们将对比传统的 Drupal 模式(用于 PHP 7 和早期的 Drupal 9)与现代的 PHP 8+ 方法,分别提供完整代码示例。最终,你将看到这种现代语法如何减少样板代码,使代码更清晰,并符合当前最佳实践。
Drupal 10(需要 PHP 8.1+)核心已经开始采用这些现代 PHP 特性,因此鼓励自定义模块开发者也这样做。我们先来回顾 Drupal 中传统的依赖注入模式,然后使用构造函数属性提升进行重构。
Drupal 中的传统依赖注入方式(PHP 8 之前)
在 Drupal 的服务和控制器中,传统依赖注入模式包括三个步骤:


EPT 模块允许你在自定义主题中覆盖模板。
现在新增了带有 --custom 后缀的主题建议,因此你可以在自定义主题中覆盖模板:
block--block-content--ebt-accordion--custom.html.twig
block--block-content--ebt-accordion.html.twig
paragraph--ept-accordion--default--custom.html.twig
paragraph--ept-accordion--custom.html.twig
paragraph--ept-accordion--default.html.twig
只需从所需的 EPT 模板中复制现有模板代码,并将其以 --custom.html.twig 后缀命名放入你的自定义主题中即可。


EPT 模块允许你在自定义主题中覆盖模板。
系统新增了带有 --custom
后缀的主题建议,因此你可以在自定义主题中覆盖模板:
block--block-content--ebt-accordion--custom.html.twig
block--block-content--ebt-accordion.html.twig
paragraph--ept-accordion--default--custom.html.twig
paragraph--ept-accordion--custom.html.twig
paragraph--ept-accordion--default.html.twig
只需将所需 EPT 模板中的现有模板代码复制到你的自定义主题中,并添加 --custom.html.twig
后缀即可。


创建新的 EPT 设置表单类
我从许多程序员那里听到对 EPT 模块设置数量的担忧:DOM 盒(DOM Box)、背景、边框、类等。这些程序员认为内容编辑可能会被这些设置搞糊涂,或者在另一种情况下被“鼓励”去做出截然不同的段落、边距、背景。一些项目需要为内容编辑提供灵活性和更多设置,但也有一些项目拥有非常严格的组件式故事手册。针对这种情况,我们需要改变我们的 EPT Settings 字段小部件(field widget)。
另外,如果你创建了一个新的 EPT 模块并附带了带选项的 JavaScript 插件,你将需要使用你自己的 EPT 设置小部件,并为这些选项提供设置字段。
EPT Core 模块提供了用于 EPT Settings 字段小部件的 EptSettingsDefaultWidget 类。它包含 DOM 盒、背景和所有其他设置。现在让我们开始创建一个新的类 EptSettingsSimpleWidget(我会把它放在 EPT Core 模块中)。它将只包含三个设置:宽度(Width)、间距(Spacing,用于段落下方的外边距)。
创建新文件:
/src/Plugin/Field/FieldWidget/EptSettingsSimpleWidget.php
