You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Drupal 8 REST API获取列表字段的允许值?

解决Drupal REST API暴露列表字段允许值的问题

嘿,这个问题我之前帮不少Headless Drupal的开发者解决过,刚好能给你几个实用的方案——毕竟默认REST API确实没把列表字段的允许值这块做完善,entity rest extra模块也差了临门一脚。结合你非Drupal/PHP开发者的情况,我分几种方式给你讲:

一、零代码快速方案(最推荐新手)

如果你不想碰PHP代码,用REST Views来做个自定义导出视图就搞定了:

  • 先安装并启用REST Views模块(Drupal官方模块,安全靠谱)
  • 创建新视图,数据源选「字段配置」(或者直接绑定你需要的内容类型)
  • 在视图里添加「字段允许值」这个字段(搜索一下就能找到)
  • 配置视图的「REST导出」显示,设置一个API路径,比如/api/field-options/{field_name}
  • 保存后,你就能通过这个路径传入字段机器名,直接拿到对应的允许值列表

这个方法完全不用写代码,灵活度还高,适合你现阶段的需求。

二、基于Entity REST Extra模块修改(小改动实现)

如果你想在现有模块基础上扩展,确实可以加几行代码实现。虽然你不懂PHP,但跟着步骤走也能搞定:

1. 找到模块核心文件

Entity REST Extra的核心逻辑一般在src/Plugin/rest/resource/EntityResource.php文件里,你需要找到它处理字段信息输出的那段代码(通常是循环遍历字段的地方)。

2. 添加允许值获取逻辑

在处理每个字段的代码块里,加入这段判断:

// 检查当前字段是否是列表类型(整数/小数/文本列表)
if ($field_definition instanceof \Drupal\Core\Field\FieldDefinitionInterface && in_array($field_definition->getType(), ['list_integer', 'list_float', 'list_string'])) {
    // 获取字段的允许值配置
    $allowed_values = $field_definition->getSetting('allowed_values');
    // 把允许值加到返回的字段数据里
    $field_data['allowed_values'] = $allowed_values;
}

这段代码的作用是:识别列表类型字段,把它的允许值提取出来,追加到模块原本返回的字段信息中。

3. 清除缓存生效

修改完代码后,去Drupal后台「配置」→「性能」页面清除所有缓存,你的修改就会生效了。

⚠️ 小提醒:直接修改模块核心文件的话,后续模块更新会覆盖你的改动。如果想更稳妥,最好创建一个自定义模块,用hook_rest_resource_alter()钩子来扩展输出——不过这个需要稍微多懂一点PHP,你可以先试试直接修改的方式,凑合用着,等后续长期方案再优化。

三、自定义REST资源(最稳妥的长期方案)

如果想做一个独立的、不依赖其他模块的API端点,也可以写个极简的自定义模块。代码其实很简单,我给你现成的:

  1. 新建一个叫field_options_rest的文件夹,里面创建两个文件:
    • field_options_rest.info.yml(模块配置文件)
      name: 'Field Options REST'
      type: module
      description: 'Exposes field allowed values via REST API'
      core_version_requirement: ^9 || ^10
      package: 'REST'
      
    • src/Plugin/rest/resource/FieldAllowedValuesResource.php(REST资源逻辑)
      <?php
      
      namespace Drupal\field_options_rest\Plugin\rest\resource;
      
      use Drupal\Core\Field\FieldStorageDefinitionInterface;
      use Drupal\rest\Plugin\ResourceBase;
      use Drupal\rest\ResourceResponse;
      use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
      
      /**
       * Provides a resource to get field allowed values.
       *
       * @RestResource(
       *   id = "field_allowed_values",
       *   label = @Translation("Field Allowed Values"),
       *   uri_paths = {
       *     "canonical" = "/api/field-allowed-values/{field_name}"
       *   }
       * )
       */
      class FieldAllowedValuesResource extends ResourceBase {
      
        /**
         * Responds to GET requests.
         *
         * @param string $field_name
         *   The field machine name (e.g., field_my_list).
         *
         * @return \Drupal\rest\ResourceResponse
         *   The response containing field allowed values.
         */
        public function get($field_name) {
          // 加载字段存储配置
          $field_storage = \Drupal::entityTypeManager()->getStorage('field_storage_config')->load($field_name);
          if (!$field_storage instanceof FieldStorageDefinitionInterface) {
            throw new NotFoundHttpException(t('Field @field not found.', ['@field' => $field_name]));
          }
      
          // 判断是否为列表类型字段
          $list_types = ['list_integer', 'list_float', 'list_string'];
          if (in_array($field_storage->getType(), $list_types)) {
            $allowed_values = $field_storage->getSetting('allowed_values');
            $response = new ResourceResponse($allowed_values);
            // 添加缓存依赖,保证数据更新后API返回最新值
            $response->addCacheableDependency($field_storage);
            return $response;
          }
      
          throw new NotFoundHttpException(t('Field @field is not a list type.', ['@field' => $field_name]));
        }
      
      }
      
  2. 把这个文件夹放到Drupal的modules/custom目录下,然后在后台启用这个模块
  3. 去「配置」→「REST资源」页面,找到「Field Allowed Values」,配置权限(允许匿名或认证用户访问)
  4. 之后你就能通过/api/field-allowed-values/field_my_list这样的路径,直接获取对应字段的允许值了

这个方案最稳妥,完全独立,不会和其他模块冲突,后续维护也方便。


内容的提问来源于stack exchange,提问作者chaixdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:59:09