symfony Поле "только для чтения" без возможности записи из пользоватеского ввода (denormalize, read only)

Ситуация:

  • От пользователя (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() вкупе с отстуствием этого поля в группе сериализации (также в последнем примере показан код, который в случае если объект создается с нуля - сам создаст его и добавит в контекст, что потребуется в случае, если после своего денормалайзера вы захотите использовать стандартный).

Key Words for FKN + antitotal forum (CS VSU):