Используйте десериализацию или геттеры и сеттеры в действиях контроллера - PullRequest
0 голосов
/ 11 мая 2018

При реализации rest json api с Symfony можно десериализовать данные для маршрута создания с помощью Jms Serializer:

$user = $serializer->deserialize($data, 'AppBundle\Entity\User', 'json');

но это делает все параметры User Entity доступными для установки из запроса POST, что может быть не очень хорошим.

Альтернативой этому является использование сеттеров в контроллере:

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

Последний вариант делает более понятным, какие параметры на самом деле можно установить, но для большого объекта требуется много кода.

Какой здесь предпочтительный способ? Это третий вариант?

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете сериализовать данные json с вашего контроллера непосредственно в Symfony, если у вас установлен компонент Serializer .

$user = $this->get('serializer')->deserialize($data, 'AppBundle\Entity\User', 'json');

Когда ваш объект создается с помощью этого метода, используя json из вашего запроса (декодированный и затем денормализованный), сеттеры вашего объекта используются для заполнения свойств вашего объекта. Не могли бы вы опубликовать свой пользовательский объект?

В качестве альтернативы вы можете использовать Классы форм для выполнения этой задачи.

Модификация по отношению к комментарию на ваш вопрос.

Группы аннотаций в ваших сущностях работают для сериализации и десериализации.

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 есть и «имя», и «описание», вы можете вставить в вашу сущность следующее:

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

Или

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

В первом случае заполняется только свойство name, а во втором случае только свойство description.

...