在 Laravel 6、Lighthouse 5 中,方法 __invoke 的参数 $args,其内部顺序与前端请求参数不一致

1、前端请求参数如下所示。如图1

图1

{
  "query": "\nmutation ThemeUpdate($themeId: ID!, $settings: [ThemeSettingDataInput!], $sections: [ThemeSettingsDataSectionInput!], $appEmbeds: [ThemeSettingsDataBlockInput!], $sessionId: String!) {\n  onlineStoreThemeSettingsDataUpdate(\n    themeId: $themeId\n    settings: $settings\n    sections: $sections\n    appEmbeds: $appEmbeds\n    sessionId: $sessionId\n  ) {\n    sessionId\n    __typename\n  }\n}\n",
  "variables": {
    "themeId": "97cdd852-2ca0-48eb-b119-6afb68e2254c",
    "settings": [],
    "sections": [
      {
        "sectionId": "announcement-bar",
        "disabled": false,
        "type": "announcement-bar",
        "settings": [
          {
            "settingId": "enable",
            "value": "true"
          },
          {
            "settingId": "homepage_only",
            "value": "false"
          },
          {
            "settingId": "sticky",
            "value": "false"
          }
        ],
        "blocks": [
          {
            "blockId": "announcement-bar-0",
            "disabled": true,
            "type": "announcement",
            "settings": [
              {
                "settingId": "text",
                "value": "❤Free Shipping Over $100.0❤"
              },
              {
                "settingId": "image",
                "value": ""
              },
              {
                "settingId": "mobile_image",
                "value": ""
              },
              {
                "settingId": "background_color",
                "value": "#000000"
              },
              {
                "settingId": "text_color",
                "value": "#ffffff"
              },
              {
                "settingId": "link",
                "value": ""
              }
            ]
          }
        ]
      },
      {
        "sectionId": "header",
        "disabled": false,
        "type": "header",
        "settings": [
          {
            "settingId": "sticky",
            "value": "false"
          },
          {
            "settingId": "menu",
            "value": ""
          },
          {
            "settingId": "secondary_menu",
            "value": ""
          },
          {
            "settingId": "text_color",
            "value": "#000000"
          },
          {
            "settingId": "background_color",
            "value": "#ffffff"
          },
          {
            "settingId": "transparent",
            "value": "true"
          },
          {
            "settingId": "transparent_text_color",
            "value": "#ffffff"
          },
          {
            "settingId": "logo",
            "value": ""
          },
          {
            "settingId": "logo_max_width",
            "value": "180"
          }
        ],
        "blocks": []
      },
      {
        "sectionId": "footer",
        "disabled": false,
        "type": "footer",
        "settings": [
          {
            "settingId": "style",
            "value": "first"
          },
          {
            "settingId": "1",
            "value": ""
          },
          {
            "settingId": "text_color",
            "value": "#222222"
          },
          {
            "settingId": "background_color",
            "value": "#f7f7f9"
          },
          {
            "settingId": "4",
            "value": ""
          },
          {
            "settingId": "show_payment_icons",
            "value": "false"
          },
          {
            "settingId": "show_dmca",
            "value": "true"
          }
        ],
        "blocks": []
      }
    ],
    "appEmbeds": [],
    "sessionId": "gY32VAiyjotH8tsfJQZ5aopd9okgAZE4dExf"
  },
  "operationName": "ThemeUpdate"
}

2、后端将方法 __invoke 的参数 $args 转换为 json,其对应前端请求体中的字段:variables。代码实现如下

    public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
    {
        $variables = json_encode($args);
        echo $variables;
        exit;
 }

3、打印 json 如下。多出了字段:directive,然后 json 内部的 key 的顺序与前端不一致。appEmbeds 的位置本应该在第 4 位,现在在第 2 位

{
  "themeId": "97cdd852-2ca0-48eb-b119-6afb68e2254c",
  "appEmbeds": [],
  "settings": [],
  "sections": [
    {
      "sectionId": "announcement-bar",
      "type": "announcement-bar",
      "disabled": false,
      "settings": [
        {
          "settingId": "enable",
          "value": "true"
        },
        {
          "settingId": "homepage_only",
          "value": "false"
        },
        {
          "settingId": "sticky",
          "value": "false"
        }
      ],
      "blocks": [
        {
          "blockId": "announcement-bar-0",
          "type": "announcement",
          "disabled": true,
          "settings": [
            {
              "settingId": "text",
              "value": "❤Free Shipping Over $100.0❤"
            },
            {
              "settingId": "image",
              "value": ""
            },
            {
              "settingId": "mobile_image",
              "value": ""
            },
            {
              "settingId": "background_color",
              "value": "#000000"
            },
            {
              "settingId": "text_color",
              "value": "#ffffff"
            },
            {
              "settingId": "link",
              "value": ""
            }
          ]
        }
      ]
    },
    {
      "sectionId": "header",
      "type": "header",
      "disabled": false,
      "settings": [
        {
          "settingId": "sticky",
          "value": "false"
        },
        {
          "settingId": "menu",
          "value": ""
        },
        {
          "settingId": "secondary_menu",
          "value": ""
        },
        {
          "settingId": "text_color",
          "value": "#000000"
        },
        {
          "settingId": "background_color",
          "value": "#ffffff"
        },
        {
          "settingId": "transparent",
          "value": "true"
        },
        {
          "settingId": "transparent_text_color",
          "value": "#ffffff"
        },
        {
          "settingId": "logo",
          "value": ""
        },
        {
          "settingId": "logo_max_width",
          "value": "180"
        }
      ],
      "blocks": []
    },
    {
      "sectionId": "footer",
      "type": "footer",
      "disabled": false,
      "settings": [
        {
          "settingId": "style",
          "value": "first"
        },
        {
          "settingId": "1",
          "value": ""
        },
        {
          "settingId": "text_color",
          "value": "#222222"
        },
        {
          "settingId": "background_color",
          "value": "#f7f7f9"
        },
        {
          "settingId": "4",
          "value": ""
        },
        {
          "settingId": "show_payment_icons",
          "value": "false"
        },
        {
          "settingId": "show_dmca",
          "value": "true"
        }
      ],
      "blocks": []
    }
  ],
  "sessionId": "gY32VAiyjotH8tsfJQZ5aopd9okgAZE4dExf",
  "directive": null
}

4、基于 Illuminate\Http\Request 获取请求参数。其顺序仍然不一致。appEmbeds 的位置本应该在第 4 位,现在在第 2 位。

print_r($context->request()->input('variables'));
exit;
{
  "themeId": "97cdd852-2ca0-48eb-b119-6afb68e2254c",
  "settings": [],
  "sections": [
    {
      "sectionId": "announcement-bar",
      "disabled": false,
      "type": "announcement-bar",
      "settings": [
        {
          "settingId": "enable",
          "value": "true"
        },
        {
          "settingId": "homepage_only",
          "value": "false"
        },
        {
          "settingId": "sticky",
          "value": "false"
        }
      ],
      "blocks": [
        {
          "blockId": "announcement-bar-0",
          "disabled": false,
          "type": "announcement",
          "settings": [
            {
              "settingId": "text",
              "value": "❤Free Shipping Over $100.0❤"
            },
            {
              "settingId": "image",
              "value": null
            },
            {
              "settingId": "mobile_image",
              "value": null
            },
            {
              "settingId": "background_color",
              "value": "#000000"
            },
            {
              "settingId": "text_color",
              "value": "#ffffff"
            },
            {
              "settingId": "link",
              "value": null
            }
          ]
        }
      ]
    },
    {
      "sectionId": "header",
      "disabled": false,
      "type": "header",
      "settings": [
        {
          "settingId": "sticky",
          "value": "false"
        },
        {
          "settingId": "menu",
          "value": null
        },
        {
          "settingId": "secondary_menu",
          "value": null
        },
        {
          "settingId": "text_color",
          "value": "#000000"
        },
        {
          "settingId": "background_color",
          "value": "#ffffff"
        },
        {
          "settingId": "transparent",
          "value": "true"
        },
        {
          "settingId": "transparent_text_color",
          "value": "#ffffff"
        },
        {
          "settingId": "logo",
          "value": null
        },
        {
          "settingId": "logo_max_width",
          "value": "180"
        }
      ],
      "blocks": []
    },
    {
      "sectionId": "footer",
      "disabled": false,
      "type": "footer",
      "settings": [
        {
          "settingId": "style",
          "value": "first"
        },
        {
          "settingId": "1",
          "value": null
        },
        {
          "settingId": "text_color",
          "value": "#222222"
        },
        {
          "settingId": "background_color",
          "value": "#f7f7f9"
        },
        {
          "settingId": "4",
          "value": null
        },
        {
          "settingId": "show_payment_icons",
          "value": "false"
        },
        {
          "settingId": "show_dmca",
          "value": "true"
        }
      ],
      "blocks": []
    }
  ],
  "appEmbeds": [],
  "sessionId": "gY32VAiyjotH8tsfJQZ5aopd9okgAZE4dExf"
}

5、基于 Illuminate\Http\Request 获取请求体的原始内容。前后端顺序一致。appEmbeds 的位置现在第 4 位。代码实现如下

$content = json_decode($context->request()->getContent(), true);
echo json_encode($content['variables']);
exit;
{
  "themeId": "97cdd852-2ca0-48eb-b119-6afb68e2254c",
  "settings": [],
  "sections": [
    {
      "sectionId": "announcement-bar",
      "disabled": false,
      "type": "announcement-bar",
      "settings": [
        {
          "settingId": "enable",
          "value": "true"
        },
        {
          "settingId": "homepage_only",
          "value": "false"
        },
        {
          "settingId": "sticky",
          "value": "false"
        }
      ],
      "blocks": [
        {
          "blockId": "announcement-bar-0",
          "disabled": false,
          "type": "announcement",
          "settings": [
            {
              "settingId": "text",
              "value": "❤Free Shipping Over $100.0❤"
            },
            {
              "settingId": "image",
              "value": ""
            },
            {
              "settingId": "mobile_image",
              "value": ""
            },
            {
              "settingId": "background_color",
              "value": "#000000"
            },
            {
              "settingId": "text_color",
              "value": "#ffffff"
            },
            {
              "settingId": "link",
              "value": ""
            }
          ]
        }
      ]
    },
    {
      "sectionId": "header",
      "disabled": false,
      "type": "header",
      "settings": [
        {
          "settingId": "sticky",
          "value": "false"
        },
        {
          "settingId": "menu",
          "value": ""
        },
        {
          "settingId": "secondary_menu",
          "value": ""
        },
        {
          "settingId": "text_color",
          "value": "#000000"
        },
        {
          "settingId": "background_color",
          "value": "#ffffff"
        },
        {
          "settingId": "transparent",
          "value": "true"
        },
        {
          "settingId": "transparent_text_color",
          "value": "#ffffff"
        },
        {
          "settingId": "logo",
          "value": ""
        },
        {
          "settingId": "logo_max_width",
          "value": "180"
        }
      ],
      "blocks": []
    },
    {
      "sectionId": "footer",
      "disabled": false,
      "type": "footer",
      "settings": [
        {
          "settingId": "style",
          "value": "first"
        },
        {
          "settingId": "1",
          "value": ""
        },
        {
          "settingId": "text_color",
          "value": "#222222"
        },
        {
          "settingId": "background_color",
          "value": "#f7f7f9"
        },
        {
          "settingId": "4",
          "value": ""
        },
        {
          "settingId": "show_payment_icons",
          "value": "false"
        },
        {
          "settingId": "show_dmca",
          "value": "true"
        }
      ],
      "blocks": []
    }
  ],
  "appEmbeds": [],
  "sessionId": "gY32VAiyjotH8tsfJQZ5aopd9okgAZE4dExf"
}
永夜

View Comments