在控制器操作中使用反序列化或 getter 和 setter
Use deserialize or getters and setters in controller actions
当使用 Symfony 实现 rest json api 时,可以使用 Jms Serializer 反序列化创建路由的数据:
$user = $serializer->deserialize($data, 'AppBundle\Entity\User', 'json');
但这使得用户实体的所有参数都可以从 POST 请求中设置,这可能不是那么好。
另一种方法是在控制器中使用设置器:
$user = new User();
$user->setUsername($request->request->get('username'));
$user->sePassword($request->request->get('password'));
...
后一个选项更清楚实际可以设置哪些参数,但对于大型实体来说需要大量代码。
这里的首选方式是什么?
是第三种选择吗?
安装 Serializer component 后,您可以在 Symfony 中原生地序列化来自控制器的 json 数据。
$user = $this->get('serializer')->deserialize($data, 'AppBundle\Entity\User', 'json');
当您的对象通过此方法创建时,使用您请求中的 json(解码然后非规范化),您的对象的 setter 用于填充对象的属性。
您可以 post 您的用户实体吗?
或者您可以使用 Form Classes 来执行此任务。
Modification in relation to the comment on your question.
实体中的注释组适用于序列化和反序列化。
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']]);
在第一种情况下,只会填充名称 属性,在第二种情况下只会填充描述 属性。
当使用 Symfony 实现 rest json api 时,可以使用 Jms Serializer 反序列化创建路由的数据:
$user = $serializer->deserialize($data, 'AppBundle\Entity\User', 'json');
但这使得用户实体的所有参数都可以从 POST 请求中设置,这可能不是那么好。
另一种方法是在控制器中使用设置器:
$user = new User();
$user->setUsername($request->request->get('username'));
$user->sePassword($request->request->get('password'));
...
后一个选项更清楚实际可以设置哪些参数,但对于大型实体来说需要大量代码。
这里的首选方式是什么? 是第三种选择吗?
安装 Serializer component 后,您可以在 Symfony 中原生地序列化来自控制器的 json 数据。
$user = $this->get('serializer')->deserialize($data, 'AppBundle\Entity\User', 'json');
当您的对象通过此方法创建时,使用您请求中的 json(解码然后非规范化),您的对象的 setter 用于填充对象的属性。 您可以 post 您的用户实体吗?
或者您可以使用 Form Classes 来执行此任务。
Modification in relation to the comment on your question.
实体中的注释组适用于序列化和反序列化。
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']]);
在第一种情况下,只会填充名称 属性,在第二种情况下只会填充描述 属性。