* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ namespace Chill\PersonBundle\Serializer\Normalizer; use Chill\PersonBundle\Entity\Person; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Chill\PersonBundle\Repository\PersonRepository; use Symfony\Component\Serializer\Exception\RuntimeException; use Symfony\Component\Serializer\Exception\UnexpectedValueException; use Chill\MainBundle\Templating\Entity\ChillEntityRenderExtension; /** * Serialize a Person entity * */ class PersonNormalizer implements NormalizerInterface, NormalizerAwareInterface, DenormalizerInterface { protected NormalizerInterface $normalizer; protected PersonRepository $repository; private ChillEntityRenderExtension $render; public const GET_PERSON = 'get_person'; public function __construct(PersonRepository $repository, ChillEntityRenderExtension $render) { $this->repository = $repository; $this->render = $render; } public function normalize($person, string $format = null, array $context = array()) { /** @var Person $person */ return [ 'type' => 'person', 'person_id' => $person->getId(), 'text' => $this->render->renderString($person), 'firstName' => $person->getFirstName(), 'lastName' => $person->getLastName(), 'birthdate' => $this->normalizer->normalize($person->getBirthdate()), 'center' => $this->normalizer->normalize($person->getCenter()), 'phonenumber' => $person->getPhonenumber(), 'mobilenumber' => $person->getMobilenumber(), 'altNames' => $this->normalizeAltNames($person->getAltNames()) ]; } protected function normalizeAltNames($altNames): array { $r = []; foreach ($altNames as $n) { $r[] = [ 'key' => $n->getKey(), 'label' => $n->getLabel() ]; } return $r; } public function denormalize($data, string $type, string $format = null, array $context = []): Person { if ($context[self::GET_PERSON] ?? true) { $id = $data['person_id'] ?? null; if (NULL === $id) { throw new RuntimeException("missing person_id into person object"); } } /** var Person $person */ $person = $this->repository->findOneById($id); if (NULL === $person) { throw new UnexpectedValueException("person id not found"); } return $person; } public function supportsNormalization($data, string $format = null): bool { return $data instanceof Person; } public function supportsDenormalization($data, string $type, ?string $format = NULL): bool { return Person::class === $type; } public function setNormalizer(NormalizerInterface $normalizer) { $this->normalizer = $normalizer; } }