Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
namespace App\Service\Dto;
use App\Service\Response\ResponseServiceInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Validator\Validator\ValidatorInterface;
abstract class BaseDto implements DtoServiceInterface
{
private ?Request $request = null;
public function __construct(
private ?ValidatorInterface $validator,
?RequestStack $requestStack = null,
)
{
if ($requestStack) {
$this->request = $requestStack->getCurrentRequest();
}
}
/**
* Получение класса Dto
*
* @return DtoServiceInterface|null
*/
public function getClass(): ?DtoServiceInterface
{
if ($this->request) {
try {
$normalizer = new ObjectNormalizer(
null,
new CamelCaseToSnakeCaseNameConverter(),
null,
new ReflectionExtractor()
);
$serializer = new Serializer(
[$normalizer, new DateTimeNormalizer()],
[new JsonEncoder()]
);
return $serializer->deserialize($this->request->getContent(), static::class, 'json');
} catch (\Exception $exception) {
return null;
}
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
}
return null;
}
public function toArray(): ?array
{
try {
$oNormalizer = new ObjectNormalizer(
null,
new CamelCaseToSnakeCaseNameConverter(),
null,
new ReflectionExtractor()
);
$oSerializer = new Serializer([$oNormalizer], [new JsonEncoder()]);
$sData = $oSerializer->serialize($this->getClass(), 'json');
return json_decode($sData, true, 512, JSON_THROW_ON_ERROR);
} catch (\Exception $oException) {
return null;
}
}
/**
* Валидация Dto
*
* @param ResponseServiceInterface $response
*
* @return bool
*/
public function validate(ResponseServiceInterface $response): bool
{
$apiResponse = $response->getResponse();
$bValid = true;
if ($classObj = $this->getClass()) {
$aErrors = $this->validator->validate($classObj);
if (count($aErrors) > 0) {
foreach ($aErrors as $error) {
$apiResponse->addError($error->getMessage());
}
$bValid = false;
} else {
$apiResponse->addError("Данные не получены");