如何通过slug / alias而不是ID获取节点数据

时间:2019-12-05 14:29:53

标签: drupal-8

像react或其他类似的前端开发人员提供的

,通过Slug而非ID获取远程节点数据非常有用。 Drupal JSONAPI不能做到这一点

2 个答案:

答案 0 :(得分:0)

路线:

myapi.default_controller_nodebyslug:
  path: '/jsonapi_tlged/node-by-slug/{slug}'
  defaults:
    _controller: '\Drupal\jsonapi_tlged\Controller\DefaultController::nodeBySlug'
    _title: 'Node by slug'
  requirements:
    _permission: 'access content'

在控制器中:

  public function nodeBySlug($slug) {
    $database =  \Drupal::database();
    $query = $database->query(
      "SELECT nid
            FROM {node} n, {url_alias} a
            WHERE n.nid = SUBSTR(a.source, 7)
            AND a.alias = '/$slug'"
    );
    $result = $query->fetchObject();
    if ($result !== false) {
      $node = Node::load($result->nid);
      return new JsonResponse($node->toArray());
    }

    //return new JsonResponse(json_encode(false));
    return new JsonResponse(false);
  }

答案 1 :(得分:0)

问题不是JSONAPI,它将仅获取您在查询中找到的对象的ID。然后,您必须将查询更改为仅搜索slug,而不是id和slug。

$query = $database->query(
      "SELECT nid
            FROM {node} n, {url_alias} a
            WHERE a.alias = '/$slug'"

    );