Php 使用JMSSerializer序列化Symfony 4 FOSRestBundle
我正在用Symfony 4和FOSRestBundle构建API。我有相当基本的关系: 实体:User.phpPhp 使用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
/**
* @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升级中迷失方向
谢谢 因为我没有得到任何建议,所以我坚持我发布的解决方案。我会留下它,以防有人需要它,因为它是完全有效的例子
干杯