繁体   English   中英

无法在 GraphQL 中查询字段(平台 API,Symfony)

[英]Cannot query field in GraphQL (Platform API, Symfony)

我正在使用 Symfony 和 Platform API 来实现 GraphQL API。 我的目标是根据用户是否登录来公开不同的字段。只有当用户登录并且是用户时才应显示电子邮件。 因此我添加了组 user:read:self。

/**
 * @ORM\Column(type="string", length=180, unique=true)
 * @Groups({"user:read:self"})
 */
private $email;

然后我实现了一个规范化器,如果用户登录,它会将组添加到上下文中:

public function normalize($object, string $format = null, array $context = [])
{
    echo "test";

    // checks whether the currently logged in user is
    // this user

    $isCurrentUser = $this->currentUser() == $object;

    if ($isCurrentUser) {
        $context['groups'][] = 'user:read:self';
    }

    $context[self::ALREADY_CALLED] = true;

    return $this->normalizer->normalize($object, $format, $context);
}

规范化器实际上是为 JSON API 和 GraphQL API 调用的。 这适用于 JSON API:

{
  "@context": "/api/contexts/User",
  "@id": "/api/users",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "/api/users/1",
      "@type": "User",
      "email": "test@example.com",
      "animals": [],
      "friends": []
    },
    {
      "@id": "/api/users/2",
      "@type": "User",
      "animals": [],
      "friends": []
    }
  ],
  "hydra:totalItems": 2
}

我以 ID 为 1 的用户身份登录,我可以看到电子邮件。 我看不到用户 2 的电子邮件。

然后在 GraphQLi 中,即使我以用户 1 身份登录,我也会查询以下内容并出现错误。我检查了 GraphQL 查询是否正在调用规范化器。 规范器工作并添加组,但是 GraphQL 似乎没有正确读取上下文:

{
  user(id: "/api/users/1") {
    email
  }
}

...
"message": "Cannot query field \"email\" on type \"User\".",
...

简短的回答:你必须添加一个吸气剂。

长答案:来自Symfonycast (顺便说一句,很棒的课程)实际上有一堆不同的“规范化器”类可以帮助完成这项工作——就像一个非常擅长将 DateTime 对象转换为字符串并返回的类。 但是主类——这个过程的核心——被称为 ObjectNormalizer。 在幕后,它使用另一个名为 PropertyAccess 的 Symfony 组件,它有一个超能力:如果你给它一个属性名称,比如标题,它真的很擅长查找和使用 getter 和 setter 方法来访问该属性。

换句话说,当 API 平台尝试将对象“规范化”为数组时,它会使用 getter 和 setter 方法来做到这一点!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM