personRender = $personRender; $this->relationshipRepository = $relationshipRepository; $this->translator = $translator; $this->translatableStringHelper = $translatableStringHelper; } public function normalize($person, $format = null, array $context = []) { /** @var Person $person */ $dateContext = $context; $dateContext['docgen:expects'] = DateTimeInterface::class; $addressContext = array_merge($context, ['docgen:expects' => Address::class]); if (null === $person) { return $this->normalizeNullValue($format, $context); } if (!$person instanceof Person) { throw new UnexpectedValueException(); } $data = [ 'type' => 'person', 'isNull' => false, 'civility' => $this->normalizer->normalize($person->getCivility(), $format, array_merge($context, ['docgen:expects' => Civility::class])), 'firstName' => $person->getFirstName(), 'lastName' => $person->getLastName(), 'altNames' => implode( ', ', array_map( static function (PersonAltName $altName) { return $altName->getLabel(); }, $person->getAltNames()->toArray() ) ), 'text' => $this->personRender->renderString($person, []), 'age' => (int) $person->getAge(), 'birthdate' => $this->normalizer->normalize($person->getBirthdate(), $format, $dateContext), 'deathdate' => $this->normalizer->normalize($person->getDeathdate(), $format, $dateContext), 'gender' => $this->translator->trans($person->getGender()), 'maritalStatus' => null !== ($ms = $person->getMaritalStatus()) ? $this->translatableStringHelper->localize($ms->getName()) : '', 'maritalStatusDate' => $this->normalizer->normalize($person->getMaritalStatusDate(), $format, $dateContext), 'email' => $person->getEmail(), 'firstPhoneNumber' => $person->getPhonenumber() ?? $person->getMobilenumber(), 'fixPhoneNumber' => $person->getPhonenumber(), 'mobilePhoneNumber' => $person->getMobilenumber(), 'nationality' => null !== ($c = $person->getNationality()) ? $this->translatableStringHelper->localize($c->getName()) : '', 'placeOfBirth' => $person->getPlaceOfBirth(), 'memo' => $person->getMemo(), 'numberOfChildren' => (string) $person->getNumberOfChildren(), 'address' => $this->normalizer->normalize($person->getCurrentPersonAddress(), $format, $addressContext), ]; if ($context['docgen:person:with-household'] ?? false) { $data['household'] = $this->normalizer->normalize( $person->getCurrentHousehold(), $format, array_merge($context, [ 'docgen:expects' => Household::class, 'docgen:person:with-household' => false, 'docgen:person:with-relations' => false, ]) ); } if ($context['docgen:person:with-relations'] ?? false) { $data['relations'] = $this->normalizer->normalize( new ArrayCollection($this->relationshipRepository->findByPerson($person)), $format, array_merge($context, [ 'docgen:person:with-household' => false, 'docgen:person:with-relation' => false, 'docgen:relationship:counterpart' => $person, ]) ); } return $data; } public function supportsNormalization($data, $format = null, array $context = []) { if ('docgen' !== $format) { return false; } return $data instanceof Person || ( null === $data && Person::class === ($context['docgen:expects'] ?? null) ); } private function normalizeNullValue(string $format, array $context) { $normalizer = new NormalizeNullValueHelper($this->normalizer, 'type', 'person'); $attributes = [ 'firstname', 'lastname', 'age', 'altNames', 'text', 'civility' => Civility::class, 'birthdate' => DateTimeInterface::class, 'deathdate' => DateTimeInterface::class, 'gender', 'maritalStatus', 'maritalStatusDate' => DateTimeInterface::class, 'email', 'firstPhoneNumber', 'fixPhoneNumber', 'mobilePhoneNumber', 'nationality', 'placeOfBirth', 'memo', 'numberOfChildren', 'address' => Address::class, ]; if ($context['docgen:person:with-household'] ?? false) { $attributes['household'] = Household::class; } $data = $normalizer->normalize($attributes, $format, $context); if ($context['docgen:person:with-relations'] ?? false) { $data['relations'] = []; } return $data; } }