api平台在hydra:member中访问嵌入式关系

时间:2019-03-10 06:14:34

标签: reactjs api-platform.com

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

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

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

例如,当我在邮递员上获取/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数组和“标题”字段中看到我的类别对象链接到论坛。

但是我注意到我的反应应用程序中所有嵌套对象的实际结果都不相同。 我只有IRI。

例如具有相同请求的

...
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",

“类别”中的所有其他字段都消失了,我不知道为什么。

有人可以帮我吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

我找到了解决方案(我有多傻),所以我向您分享了秘诀:

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

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));
        ....

如您所见,我只是评论了规范化行(在我的情况下没有用)。在任何需要的地方进行操作,一切都应该再次工作!