首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Fractal Transformer结果中删除'data‘属性?

如何从Fractal Transformer结果中删除'data‘属性?
EN

Stack Overflow用户
提问于 2016-12-27 19:04:06
回答 3查看 1.7K关注 0票数 8

我尝试使用以下代码(via Fractal)来获得结果:

代码语言:javascript
复制
public static function doIt($array, $transformer)
{
    $manager = new Manager();

    $serializer = new \League\Fractal\Serializer\ArraySerializer();
    $manager->setSerializer($serializer);

    if ($array instanceof Collection) {
        $resource = new FractalCollection($array, new $transformer);
    } else {
        $resource = new FractalItem($array, new $transformer);
    }

    return $manager->createData( $resource )->toArray();
}

当你看的时候,我补充说

代码语言:javascript
复制
$serializer = new \League\Fractal\Serializer\ArraySerializer();
$manager->setSerializer($serializer);

从结果数组中删除“data”属性。

代码语言:javascript
复制
array:3 [▼
  "key" => 1
  "title" => "First Level Title"
  "childrens" => array:1 [▼
    "data" => array:16 [▼          ←-------- it need remove!
      0 => array:2 [▼
        "key" => 2
        "title" => "Children Title"
      ]
      1 => array:2 [▶]
      2 => array:2 [▶]
      3 => array:2 [▶]
    ]
  ]
]

它可以很好地工作,但只适用于第一级数组。如何使其适用于所有嵌套数组?

EN

回答 3

Stack Overflow用户

发布于 2016-12-27 19:48:49

我解决了这个问题。您需要创建自己的DataArraySerializer序列化扩展。它有三个方法,其中每个方法都需要将返回值更改为:

代码语言:javascript
复制
use League\Fractal\Serializer\DataArraySerializer;

class Serializer extends DataArraySerializer
{
    /**
     * Serialize a collection.
     *
     * @param string $resourceKey
     * @param array  $data
     *
     * @return array
     */
    public function collection($resourceKey, array $data)
    {
        return $data;
    }

    /**
     * Serialize an item.
     *
     * @param string $resourceKey
     * @param array  $data
     *
     * @return array
     */
    public function item($resourceKey, array $data)
    {
        return $data;
    }

    /**
     * Serialize null resource.
     *
     * @return array
     */
    public function null()
    {
        return [];
    }

}

现在,我们只需将此序列化程序设置为我们使用的Manager实例。

代码语言:javascript
复制
$manager = new Manager();

$manager->setSerializer(new Serializer());
票数 4
EN

Stack Overflow用户

发布于 2018-05-08 18:01:32

你可以使用current()方法,我希望它能解决你的问题。

示例:

代码语言:javascript
复制
return current($manager->createData( $resource )->toArray());
票数 3
EN

Stack Overflow用户

发布于 2016-12-27 19:12:46

您可以使用unset:

代码语言:javascript
复制
 unset($array['data']);
票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41343957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档