Php 如何将分形变换对象直接包含到集合元数据中,而无需设置数据键

Php 如何将分形变换对象直接包含到集合元数据中,而无需设置数据键,php,json,key,serialization,Php,Json,Key,Serialization,我在JsonApiSerializer中使用league/fractal 我有一个用于json输出的用户集合。 现在我想向这个json响应添加一些过滤器数据(比如当前过滤器的用户计数) 我明白了: $resource = new Collection($dataProvider->getData(), new UserTransformer()); //包含我找到的一些非直接链接数据的唯一方法是使用setMeta(): 但是项目和“某些”集合(是的,它们也是集合)也包含在其中的“数据”键

我在JsonApiSerializer中使用league/fractal

我有一个用于json输出的用户集合。 现在我想向这个json响应添加一些过滤器数据(比如当前过滤器的用户计数)

我明白了:

$resource = new Collection($dataProvider->getData(), new UserTransformer());
//包含我找到的一些非直接链接数据的唯一方法是使用setMeta():

但是项目和“某些”集合(是的,它们也是集合)也包含在其中的“数据”键中

所以,我得到了这个结构:

{
    'data' => [
         {//user1},{//user2},...
    ],
    'meta' => {
         'projects' => {
              'data' => {...}
         },
         'somes' => {
              'data' => {...}
         }
    }
}
但我想要的是:

{
    'data' => [
         {//user1},{//user2},...
    ],
    'meta' => {
         'projects' => {...}, //there is no 'data' key
         'somes' => {...}     //there is no 'data' key
    }
}

我该怎么办?

这是一种黑客行为,但如果没有在fractal的League\fractal\Manager::createData()中硬编码的重构作用域类,效果很好。使用自己的作用域类实现的唯一方法是在Manager的扩展中重载此方法

<?php
use League\Fractal\Serializer\JsonApiSerializer;

/**
 * Class EmbedSerializer
 */
class EmbedSerializer extends JsonApiSerializer
{
    const RESOURCE_EMBEDDED_KEY = 'embedded';

    /**
     * Serialize a collection.
     *
     * @param string $resourceKey
     * @param array  $data
     * @return array
     */
    public function collection($resourceKey, array $data)
    {
        return $resourceKey === self::RESOURCE_EMBEDDED_KEY ? $data : [$resourceKey ?: 'data' => $data];
    }

    /**
     * Serialize an item.
     *
     * @param string $resourceKey
     * @param array  $data
     * @return array
     */
    public function item($resourceKey, array $data)
    {
        return $resourceKey === self::RESOURCE_EMBEDDED_KEY ? $data : [$resourceKey ?: 'data' => [$data]];
    }
}
这就是你所需要的。希望这会有帮助

<?php
use League\Fractal\Serializer\JsonApiSerializer;

/**
 * Class EmbedSerializer
 */
class EmbedSerializer extends JsonApiSerializer
{
    const RESOURCE_EMBEDDED_KEY = 'embedded';

    /**
     * Serialize a collection.
     *
     * @param string $resourceKey
     * @param array  $data
     * @return array
     */
    public function collection($resourceKey, array $data)
    {
        return $resourceKey === self::RESOURCE_EMBEDDED_KEY ? $data : [$resourceKey ?: 'data' => $data];
    }

    /**
     * Serialize an item.
     *
     * @param string $resourceKey
     * @param array  $data
     * @return array
     */
    public function item($resourceKey, array $data)
    {
        return $resourceKey === self::RESOURCE_EMBEDDED_KEY ? $data : [$resourceKey ?: 'data' => [$data]];
    }
}
    /** @var $this->fractal League\Fractal\Manager */
    $this->fractal->setSerializer(new EmbedSerializer());

    $projectsCollection = $this->fractal->createData(
        new Collection($projects, new UserProjectTransformer(), 'embedded')
    )->toArray();

    $resource = new Collection($users, new UserTransformer());
    $resource->setMetaValue('projects', $projectsCollection);