php - 在页面 API 请求中包含相关模型数据

标签 php api silverstripe

我有一个相对简单的设置,使用 SilverStripe 3.2.1 和 restfulserver addon 运行并使用各种与使用 the elemental addon 的页面相关联的小部件.

当我通过 API 发出 GET 请求以检索第 1 页的一些数据时,我可以看到关联的 ElementAreaID:

# GET /api/v1/Page/1.json?fields=Title,URLSegment,Content,ElementArea 
{
  "Title": "Welcome",
  "URLSegment": "home",
  "Content": "A bunch of HTML here from all the widgets in the page...",
  "ElementArea": {
    "className": "ElementalArea",
    "href": "http://ss.local:3000/api/v1/ElementalArea/11.json",
    "id": "11"
  }
}

如果我通过 ElementalArea API 调用访问链接,它将列出我页面中的所有元素:

# GET /api/v1/ElementalArea/11.json
{
  "ID": "11",
  "Widgets": [
    {
      "className": "Widget",
      "href": "http://ss.local:3000/api/v1/Widget/9.json",
      "id": 9
    },
    {
      "className": "Widget",
      "href": "http://ss.local:3000/api/v1/Widget/8.json",
      "id": 8
    },
    ...
  ]
}

如果我遵循这些 API 路径,它将提供每个小部件的最新版本的内容。

我的问题是如何在原始页面字段列表中包含 Widget DataObjects 中的某些字段?

理想情况下,我希望每个 Widget 的 Content 字段与初始 Page API 请求一起返回到一个数组中。


供引用:

  • 一个Page有一个ElementArea
  • 一个ElementArea有很多Widget
  • Widget 包含我想要用于我的Page
  • 的内容

最佳答案

前言:目前似乎没有办法用 RESTful 服务器模块输出类似数组的数据结构(当然关系除外)。所提出的解决方案是一种滥用方式的黑客攻击 JSONDataFormatter格式输出。

由于 JSONDataFormatter 使用 forTemplate 在将字段转换为 JSON 之前渲染字段,我们可以创建自己的对象渲染器,通过 返回数组而不是字符串对于模板。这可能看起来像这样:

class FlatJSONDataList extends ViewableData
{
    protected $list;

    public function __construct(array $list)
    {
        parent::__construct();
        $this->list = $list;
    }

    public function forTemplate()
    {
        return $this->list;
    }
}

然后在您的页面中,有一个额外的方法就足够了,如下所示:

public function getWidgetContents()
{
    return FlatJSONDataList::create(
        $this->ElementArea()->Widgets()->column('Content')
    );
}

然后您可以在 Field-list 中包含 WidgetContents 以获取数组中的所有 widget Content 字段:

GET /api/v1/Page/1.json?fields=Title,URLSegment,Content,WidgetContents 

关于php - 在页面 API 请求中包含相关模型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35639350/

相关文章:

PHP + MySQL : Get result from fetch array and convert to variables automatically?

java - 使用 C++ 编译和运行 java 文件时无法加载主类

SilverStripe ModelAdmin 菜单标题翻译

php - SilverStripe 按精确顺序获取 id

jquery - 默认情况下在 Silverstripe 的 ModelAdmin 中显示过滤器表单

php - Laravel 5.8 中卡在/电子邮件/验证上

PHP 两个数组比较

php - dompdf - 当我指定 a4,横向时停止

python - django-tastypie : Related data not saving

java - 如果响应与帖子类不同,如何从帖子请求中获得响应