我有一個PostController這樣的:
#[Route(name: 'add', methods: ['POST'])]
public function addPost(Request $request): JsonResponse
{
/** @var PostRequestDto $postRequest */
$postRequest = $this->serializer->deserialize(
$request->getContent(),
PostRequestDto::class,
'json'
);
return $this->postService->addPost($postRequest);
}
PostService:
public function addPost(PostRequestDto $request): JsonResponse
{
$errors = $this->validator->validate($request);
if (count($errors) > 0) {
throw new ValidationHttpException($errors);
}
#...
return new JsonResponse(null, Response::HTTP_CREATED);
}
并且PostRequestDto:
class PostRequestDto
{
#[Assert\NotBlank]
#[Assert\Length(max: 250)]
private ?string $title;
#[Assert\NotBlank]
#[Assert\Length(max: 1000)]
private ?string $article;
#[Assert\NotBlank]
#[Assert\Image]
private ?File $photo;
#[Assert\NotBlank]
#[Assert\GreaterThanOrEqual('now', message: 'post_request_dto.publish_date.greater_than_or_equal')]
private ?DateTimeInterface $publishDate;
}
我的郵遞員請求如下所示:
{
"title": "Test",
"article": "lorem ipsum....",
"photo": "base64...",
"publishDate": "2021-10-15 08:00:00"
}
正如您從郵遞員請求中看到的,我正在發送base64編碼檔案。現在,在控制器我想反序列化,以配合PostRequestDto這樣我就可以驗證它作為File在PostService-我怎樣才能做到這一點?
uj5u.com熱心網友回復:
我不知道你的序列化器 ( $this->serializer)究竟是如何配置的,但我認為你必須調整/添加你的規范化器Symfony\Component\Serializer\Normalizer\DataUriNormalizer
// somewhere in your controller/service where serilaizer is configured/set
$normalizers = [
//... your other normilizers if any
new DataUriNormalizer(), // this one
];
$encoders = [new JsonEncoder()];
$this->serializer = new Serializer($normalizers, $encoders);
如果你往里面DataUriNormalizer看,你會看到,它的作用File正是你在你的PostRequestDto
唯一需要注意的 → base64 格式。如果按照鏈接的denormilize()方法,你會看到它預計data:image/png;base64,...
所以它必須開始data:...,你可能有你的郵遞員JSON的有效載荷改變
{
"title": "Test",
"article": "lorem ipsum....",
"photo": "data:<your_base64_string>",
"publishDate": "2021-10-15 08:00:00"
}
由于您使用影像,我也會發送 mime 型別。喜歡:
"photo": "data:image/png;base64,<your_base64_string>",
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314018.html
