在控制器操作中使用反序列化或 getter 和 setter



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

$user = $serializer->deserialize($data, 'AppBundleEntityUser', 'json');

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

另一种方法是在控制器中使用资源库:

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

后一个选项更清楚地表明哪些参数实际上能够设置,但它需要大量代码才能用于大型实体。

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

一旦安装了序列化程序组件,您就可以在 Symfony 中原生序列化控制器中的 json 数据。

$user = $this->get('serializer')->deserialize($data, 'AppBundleEntityUser', 'json');

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

或者,您可以使用窗体类来执行此任务。

修改

与您的问题的评论有关。

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

class Item
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
* @Groups({"first", "second"})
*/
private $id;
/**
* @ORMColumn(type="string", name="name", length=100)
* @Groups({"first"})
*/
private $name;
/**
* @ORMColumn(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 数据中同时包含"名称"和"描述",则可以使用以下内容将其插入到实体中:

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

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

在第一种情况下,仅填充 name 属性,在第二种情况下仅填充说明属性。

最新更新