Десериализация JMS не работает с политикой исключения - PullRequest
0 голосов
/ 17 ноября 2018

Я работаю над приложением Symfony , и у меня есть объект User:

/**
* @ORM\Entity
* @ORM\Table(name="user")
* @Serializer\ExclusionPolicy("all")
*/
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     * @Serializer\Expose()
     */
    private $id;

    /**
     * @var string $email
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     * @Assert\NotBlank()
     * @Assert\Email()
     * @Serializer\Expose()
     */
    private $email;
    /**
     * @ORM\Column(type="string", length=64)
     * @Assert\NotBlank()
     */
    private $password;
}

Я пытаюсь десериализовать полезную нагрузку для моего объекта следующим образом:

$data = $this->request->request->all();
$jsonContent = $this->serializer->serialize($data, 'json'); // serializing goes fine
dump($jsonContent);
{
     "email":"John.Doe@domain.com",
     "password":"123"
}
$object = $this->serializer->deserialize($jsonContent, User::class, 'json'); 
dump($object); // I'm getting null values
AppBundle\Entity\User {
  -id: null
  -email: null
  -password: null
}

поэтому, когда я пытаюсь проверить свой объект с помощью валидатора:

$errors = $this->validator->validate($object);

проверка завершается неудачно с этим ответом:

{
  "errors" : 
  {
     "email": "This value should not be blank.",
     "password": "This value should not be blank."
  }
}

но при удалении этой строки @Serializer\ExclusionPolicy("all") все работает нормально.

Я использую:

  • Symfony 3.4
  • jms / serializer-bundle 2.3

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 04 февраля 2019

Еще один способ сделать это - использовать форму следующим образом:

UserType

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email')
            ->add('password')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\User'
        ));
    }
}
?>

В вашем контроллере вы можете иметь:

class UserController extends Controller
{
    /**
     * @Route("/api/users", name="api_users_post_something")
     * @Method("POST")
     */
    public function postSomethingAction(Request $request)
    {
        $data = $this->serializer->deserialize($request->getContent(), 'array', 'json');
        $user = new User();
        $form = $this->createForm(UserType::class, $user, ['csrf_protection' => false]); // disable csrf_protection if you are making api
        $form->submit($data);

        if(!($form->isSubmitted() && $form->isValid())) {
            // Send form errors
        }

        // Persist and flush or do what you want to do
    }
}
?>

Этопросто попытка примера путем обработки формы и проверки формы.Я надеюсь, что это поможет вам.

...