在控制器操作

时间:2018-05-11 19:53:27

标签: symfony fosrestbundle jmsserializerbundle

使用Symfony实现rest json api时,可以使用Jms Serializer对创建路由的数据进行反序列化:

$user = $serializer->deserialize($data, 'AppBundle\Entity\User', 'json');

但是这使得用户实体的所有参数都可以从POST请求中设置,这可能不是那么好。

另一种方法是在控制器中使用setter:

$user = new User();
$user->setUsername($request->request->get('username'));
$user->sePassword($request->request->get('password'));
...

后一个选项使得更清楚哪些参数实际上能够设置,但它需要大量实体的大量代码。

这里的首选方式是什么? 这是第三种选择吗?

1 个答案:

答案 0 :(得分:2)

安装Serializer component后,您可以在Symfony中本地序列化控​​制器中的json数据。

$user = $this->get('serializer')->deserialize($data, 'AppBundle\Entity\User', 'json');

当您通过此方法创建对象时,使用请求中的json(已解码然后非规范化),您的对象的setter将用于填充对象的属性。 你可以发布你的用户实体吗?

或者,您可以使用Form Classes执行此任务。

  

与您的问题评论相关的修改。

注释实体中的组用于序列化和反序列化。

class Item
{
     /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"first", "second"})
     */
    private $id;

    /**
     * @ORM\Column(type="string", name="name", length=100)
     * @Groups({"first"})
     */
    private $name;

    /**
     * @ORM\Column(type="string", name="name", length=200)
     * @Groups({"second"})
     */
    private $description;

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

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getDescription()
    {
        return $this->description;
    }

    public function setDescription($description)
    {
        $this->description = $description;
    }
}

如果POST数据中同时包含“name”和“description”,则可以使用以下内容将其插入实体:

$object = $this->get('serializer')->deserialize($data, 'AppBundle\Entity\User', 'json', ['groups' => ['first']]);

或者

$object = $this->get('serializer')->deserialize($data, 'AppBundle\Entity\User', 'json', ['groups' => ['second']]);

在第一种情况下,只会填充name属性,而在第二种情况下只会填充description属性。