Api-平台访问 hydra:member 中的嵌入式关系

Api-platform accessing embedded relations in hydra:member

我正在使用 Api-Platform 和 React 作为客户端。

我有一个包含其他对象的论坛实体:作者(用户实体)和类别(类别实体)。

我在这些实体中嵌入了 @Groups 注释,以便更轻松地检索它们。

例如,当我在 Postman 上获取 /api/forums/ 时,我得到了这个结果:

{
"@context": "/api/contexts/Forum",
"@id": "/api/forums",
"@type": "hydra:Collection",
"hydra:member": [
    {
        "@id": "/api/forums/79",
        "@type": "Forum",
        "id": 79,
        "subject": "Sujet numéro 0",
        "message": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
        "category": {
            "@id": "/api/categories/183",
            "@type": "Category",
            "title": "Category 2"
        },

看起来不错:我们可以看到我的类别对象在 hydra:member 数组和一个 "title" 字段中链接到论坛。

但我注意到,对于所有嵌套对象,我真正得到的结果在我的 React 应用程序中是不同的。 我只得到 IRIs..

例如同一个请求:

...
fetch('forums')
  .then(response =>
    response
      .json()
      .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) }))
  )
  .then(({ retrieved, hubURL }) => {
    retrieved = normalize(retrieved);
...

我得到这个结果:

{
"@context": "/api/contexts/Forum",
"@id": "/api/forums",
"@type": "hydra:Collection",
"hydra:member": [
    {
        "@id": "/api/forums/79",
        "@type": "Forum",
        "id": 79,
        "subject": "Sujet numéro 0",
        "message": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
        "category": "/api/categories/183",

"category" 上所有其他字段都消失了,我不明白为什么。

有人可以帮我吗?

提前致谢

我找到了解决方案(我真傻),所以我把窍门分享给你:

在src/utils/dataAccess文件中,有一个归一化函数:

export function normalize(data) {
  if (has(data, 'hydra:member')) {
    // Normalize items in collections
    data['hydra:member'] = data['hydra:member'].map(item => normalize(item));
    return data;
  }

  // Flatten nested documents
  return mapValues(data, value =>
    Array.isArray(value)
      ? value.map(v => get(v, '@id', v))
      : get(value, '@id', value)
  );
}

似乎每次提取后都会调用此函数:

return fetch(id)
      .then(response =>
        response
          .json()
          .then(retrieved => ({ retrieved, hubURL: extractHubURL(response) }))
      )
      .then(({ retrieved, hubURL }) => {
        //retrieved = normalize(retrieved);

        dispatch(loading(false));
        dispatch(success(retrieved));
        ....

如您所见,我只是注释了规范化行(在我的例子中没有用)。在需要的地方执行此操作,一切都会恢复正常!