阻止jms序列化程序反序列化某些属性

时间:2018-03-06 12:56:38

标签: symfony doctrine jmsserializerbundle jms-serializer

如果我将这个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();

如果当前用户存在,它将覆盖当前用户并更新名称和标题。但是,如果我只希望此路由有权更新名称呢?有什么方法可以防止某些属性被反序列化?就像这个案例中的标题一样。

2 个答案:

答案 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
}

如果您没有很多具体的路线可以做,那就很有效。