如果我将这个json发布到我的api:
{
user: {
id: 1,
name: 'John',
title: 'CEO'
}
}
并将其反序列化并将其保存到我的控制器中的数据库:
$user = $serializer->deserialize($data, User::class, 'json');
$entity = $em->merge($user);
$em->persist($entity);
$em->flush();
如果当前用户存在,它将覆盖当前用户并更新名称和标题。但是,如果我只希望此路由有权更新名称呢?有什么方法可以防止某些属性被反序列化?就像这个案例中的标题一样。
答案 0 :(得分:0)
在jms序列化程序中,您可以使用一般排除策略:
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Expose;
/**
*
*
* @ExclusionPolicy("all")
*/
class User
{
protected $name;
/**
* @Expose
*/
protected $title;
}
您可以在此处查看更多信息:https://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies
答案 1 :(得分:0)
如果您希望拥有比排除政策更具模块性的内容,则可以使用表单。
创建表单:
class UserPutType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name');
}
}
然后在你的控制器中:
$form = $this->createForm(UserPutType::class, $user);
$form->submit($request->request->all());
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($user);
$em->flush();
return $user;
}
return $form;
如果您只需要更改用户名,另一种方法可能是使用路由参数。你可以使用这样的方法:
private function putUserName(User $user, $name) {
$userManager = $this->get('fos_user.user_manager');
$user->setName($name);
$entityManager->updateUser($user);
... //Return statement
}
如果您没有很多具体的路线可以做,那就很有效。