Php 使用JMSSerializer序列化Symfony 4 FOSRestBundle

Php 使用JMSSerializer序列化Symfony 4 FOSRestBundle,php,symfony,symfony4,fosrestbundle,jms-serializer,Php,Symfony,Symfony4,Fosrestbundle,Jms Serializer,我正在用Symfony 4和FOSRestBundle构建API。我有相当基本的关系: 实体:User.php /** * @ORM\Entity(repositoryClass="App\Repository\UserRepository") */ class User { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") * @JMS\Groups({"o

我正在用Symfony 4和FOSRestBundle构建API。我有相当基本的关系:

实体:User.php

/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
*/
class User
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @JMS\Groups({"onlyId"})
     */
    private $id;

    /**
     * @ORM\Column(unique=true, type="string", length=255)
     */
    private $email;

    //...

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\UserProduct", mappedBy="user", orphanRemoval=true)
     */
    private $userProducts;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserProductRepository")
*/
class UserProduct
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @JMS\Groups({"onlyId"})
     */
    private $id;

    //...

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="userProducts")
     * @JMS\Groups({"onlyId"})
     */
    private $user;
实体:UserProduct.php

/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
*/
class User
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @JMS\Groups({"onlyId"})
     */
    private $id;

    /**
     * @ORM\Column(unique=true, type="string", length=255)
     */
    private $email;

    //...

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\UserProduct", mappedBy="user", orphanRemoval=true)
     */
    private $userProducts;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserProductRepository")
*/
class UserProduct
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @JMS\Groups({"onlyId"})
     */
    private $id;

    //...

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="userProducts")
     * @JMS\Groups({"onlyId"})
     */
    private $user;
配置:fos_rest.yaml

fos_rest:
    body_converter:
        enabled: true
    view:
        view_response_listener: 'force'
        formats:
            json: true
    routing_loader:
        default_format: json
#    param_fetcher_listener:  true
#    allowed_methods_listener:  true
#    routing_loader: true
#    view:
#        view_response_listener:  true
#    exception:
#        codes:
#            App\Exception\MyException: 403
#        messages:
#            App\Exception\MyException: Forbidden area.
    format_listener:
        rules:
            - { path: ^/api, prefer_extension: true, fallback_format: json, priorities: [ json, html ] }
            - { path: ^/login_check, stop: true }
            - { path: ^/register, stop: true }
起初,当我发布用户ID和JSON数据时,我无法发布将JSON发送到端点的用户产品,因为它抛出的是
实体的实例,而不是
整数或我正在发送的任何东西。我通过本教程了解到了这一点->

它使用Symfony序列化程序。当返回FOSRestBundle的
视图时,我得到的是
循环引用
错误。在这一点上,我知道使用JMS序列化工具可以很好地处理
循环引用
错误,并在我的
posteSerProductAction
控制器中使用它:

要发布产品并处理循环引用,我使用此控制器(使用教程中定制的反序列化方法反序列化发布的JSON,将其插入数据库,然后在JMS序列化程序及其组的帮助下返回响应(非视图):

我得到的答复是好的和明确的:

{
    "id": 100,
    "user": {
        "id": 9
    }
}
但这似乎有很多不必要的步骤。此外,如果我选择这种方法,我需要自己将JMS序列化添加到我的每个控制器(GET、PUT等)

所以我的问题是为什么FOSRestBundle在默认情况下不使用JMS来呈现
视图
,正如它在文档中所说的那样(如果已安装并注册)?我是否应该将其添加到FOSRestBundle之外的某个位置以识别它?如果可能的话,我一开始就不需要使用Symfony序列化程序了?我想我可能会在所有Symfony 4升级中迷失方向


谢谢

因为我没有得到任何建议,所以我坚持我发布的解决方案。我会留下它,以防有人需要它,因为它是完全有效的例子

干杯