symfony4,FOSRestBundle和ramsey / uuid-doctrine - 将uuid对象转换为REST API的字符串

时间:2018-04-02 11:26:52

标签: serialization uuid fosrestbundle

我现在正在使用symfony4并且喜欢它。现在我想从ramsey开始使用FOSRestBundle和uuid。

到目前为止没有问题,eveything工作正常,当我调用API时,我得到了带字段的JSON响应。

字段是:

  • id, type: uuid
  • username, type: string
  • email, type: string

我触发的控制器操作:

/**
 * @Rest\Get("/api/users", name="api_users_list")
 */
public function index()
{
    $users = $this->getDoctrine()->getRepository(User::class)->findAll();

    return View::create($users, 200);
}

我得到的输出:

{
    "email": "mail@example.com",
    "id": {
        "codec": {
            "builder": {
                "converter": {}
            }
        },
        "converter": {},
        "factory": {
            "codec": {
                "builder": {
                    "converter": {}
                }
            },
            "node_provider": {
                "node_providers": [
                    {},
                    {}
                ]
            },
            "number_converter": {},
            "random_generator": {},
            "time_generator": {
                "node_provider": {
                    "node_providers": [
                        {},
                        {}
                    ]
                },
                "time_converter": {},
                "time_provider": {}
            },
            "uuid_builder": {
                "converter": {}
            }
        },
        "fields": {
            "clock_seq_hi_and_reserved": "a6",
            "clock_seq_low": "6c",
            "node": "a9a300ef5181",
            "time_hi_and_version": "4aa1",
            "time_low": "e3e6cdee",
            "time_mid": "5c93"
        }
    },
    "username": "apokalipscke"
}

正如您所看到的,id字段是一个对象,但我希望它只包含uuid的字符串表示形式,如:“e3e6cdee-5c93-4aa1-a66c-a9a300ef5181”。我在互联网上搜索并试了很多东西但是找不到答案如何解决这个问题。

我想要的输出:

{
    "id": "e3e6cdee-5c93-4aa1-a66c-a9a300ef5181",
    "username": "apokalipscke",
    "email": "mail@example.com"
}

4 个答案:

答案 0 :(得分:0)

我现在自己解决了。

我只需要从

更改字段的列类型
/**
 * @var UuidInterface
 *
 * @ORM\Id()
 * @ORM\Column(type="uuid", unique=true)
 * @ORM\GeneratedValue(strategy="CUSTOM")
 * @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Id()
 * @ORM\Column(type="string", unique=true, length=36)
 * @ORM\GeneratedValue(strategy="CUSTOM")
 * @ORM\CustomIdGenerator(class="Ramsey\Uuid\Doctrine\UuidGenerator")
 */
private $id;

我不知道这是否正确,但它对我有用。

答案 1 :(得分:0)

改变吸气剂使我可以解决此问题。

 public function getPersonId() 
{
    return $this->personId;
}

将其更改为:

public function getPersonId() 
{
    return $this->personId->toString();
}

答案 2 :(得分:0)

我终于找到了解决方案。 我写了一个处理程序PersonH​​andler。

namespace App\Serializer\Handler;

use App\Entity\Person;
use JMS\Serializer\JsonSerializationVisitor;
use JMS\Serializer\JsonDeserializationVisitor;
use JMS\Serializer\SerializationContext as Context;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\Handler\SubscribingHandlerInterface;

class PersonHandler implements SubscribingHandlerInterface
{
    public static function getSubscribingMethods()
    {
        return [
            [
                'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
                'format' => 'json',
                'type' => 'App\Entity\Person',
                'method' => 'serialize',
            ],
            [
                'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,
                'format' => 'json',
                'type' => 'App\Entity\Person',
                'method' => 'deserialize',
            ]
        ];
    }

    public function serialize(JsonSerializationVisitor $visitor, Person $person, array $type, Context $context)
    {

        $data = [
            'id' => $person->getId(),
            'name' => $person->getName(),
            'email' => $person->getEmail()
        ];

        return $visitor->visitArray($data, $type, $context);
    }

    public function deserialize(JsonDeserializationVisitor $visitor, $data)
    {
        return new Person($data);
    }
}

它将允许自定义序列化。 在Person实体中,我修改了方法getId()

function getId() {
    return $this->id->toString();       
}

所以我们将在返回的json中包含uuid

答案 3 :(得分:0)

正确的解决方案是为uuid类型添加一个序列化处理程序。 幸运的是,它已在此捆绑软件中实现: https://github.com/mhujer/jms-serializer-uuid-bundle

只需安装捆绑软件,然后在$ id属性中添加一个@Serializer\Type("uuid")注释。