symfony Поле "только для чтения" без возможности записи из пользоватеского ввода (denormalize, read only)
Primary tabs
Ситуация:
- От пользователя (SPA) приходит фото как поле photo, а мы отдаем в ответ photoPath, который генерируем уже после загрузки файла на фронте
Задача:
- Закрыть photoPath от записи при пользовательском вводе
Решение
Заводим группу сериализации/десериализации SetUserGroup, в нашем Entity настраиваем так:
/** * @ORM\Column(type="string", length=255, nullable=true) * @Groups({"UserGroup", "SetUserGroup"}) * */ private $surname; /** * @ORM\Column(type="string", length=512, nullable=true) * @Groups({"UserGroup"}) */ private $photoPath;
-- нужные поля включаем в нее, а photoPath нет.
Далее в точке обработки запроса при вызове денормолайзера указываем нашу группу (фрагмент из метода редактирования сущности):
$groups = ['SetUserGroup']; $this->serializer->deserialize( $request->getContent(), "App\Entity\User", 'json', ['object_to_populate' => $user, 'groups' => $groups] );
А потом уже в денормалайзере (для работы с таким полем придется создать отдельный) в нужном месте делаем:
if (empty($context['object_to_populate'])) { $context['object_to_populate'] = new $class(); } $context['object_to_populate']->setPhotoPath( 'нужное значение' );
-- т.е. главная идея в прямом вызове ->setPhotoPath() вкупе с отстуствием этого поля в группе сериализации (также в последнем примере показан код, который в случае если объект создается с нуля - сам создаст его и добавит в контекст, что потребуется в случае, если после своего денормалайзера вы захотите использовать стандартный).
- Log in to post comments
- 1188 reads