/home/smartonegroup/public_html/system/vendor/jms/serializer/src/Handler/FormErrorHandler.php
<?php
declare(strict_types=1);
namespace JMS\Serializer\Handler;
use JMS\Serializer\GraphNavigatorInterface;
use JMS\Serializer\Visitor\SerializationVisitorInterface;
use JMS\Serializer\XmlSerializationVisitor;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface as TranslatorContract;
use function get_class;
final class FormErrorHandler implements SubscribingHandlerInterface
{
/**
* @var TranslatorInterface|TranslatorContract|null
*/
private $translator;
/**
* @var string
*/
private $translationDomain;
/**
* {@inheritdoc}
*/
public static function getSubscribingMethods()
{
$methods = [];
foreach (['xml', 'json'] as $format) {
$methods[] = [
'direction' => GraphNavigatorInterface::DIRECTION_SERIALIZATION,
'type' => Form::class,
'format' => $format,
];
$methods[] = [
'direction' => GraphNavigatorInterface::DIRECTION_SERIALIZATION,
'type' => FormInterface::class,
'format' => $format,
'method' => 'serializeFormTo' . ucfirst($format),
];
$methods[] = [
'direction' => GraphNavigatorInterface::DIRECTION_SERIALIZATION,
'type' => FormError::class,
'format' => $format,
];
}
return $methods;
}
public function __construct(?object $translator = null, string $translationDomain = 'validators')
{
if (null !== $translator && (!$translator instanceof TranslatorInterface && !$translator instanceof TranslatorContract)) {
throw new \InvalidArgumentException(sprintf(
'The first argument passed to %s must be instance of %s or %s, %s given',
self::class,
TranslatorInterface::class,
TranslatorContract::class,
get_class($translator),
));
}
$this->translator = $translator;
$this->translationDomain = $translationDomain;
}
public function serializeFormToXml(XmlSerializationVisitor $visitor, FormInterface $form, array $type): \DOMElement
{
$formNode = $visitor->getDocument()->createElement('form');
$formNode->setAttribute('name', $form->getName());
$formNode->appendChild($errorsNode = $visitor->getDocument()->createElement('errors'));
foreach ($form->getErrors() as $error) {
$errorNode = $visitor->getDocument()->createElement('entry');
$errorNode->appendChild($this->serializeFormErrorToXml($visitor, $error, []));
$errorsNode->appendChild($errorNode);
}
foreach ($form->all() as $child) {
if ($child instanceof Form) {
if (null !== $node = $this->serializeFormToXml($visitor, $child, [])) {
$formNode->appendChild($node);
}
}
}
return $formNode;
}
public function serializeFormToJson(SerializationVisitorInterface $visitor, FormInterface $form, array $type): \ArrayObject
{
return $this->convertFormToArray($visitor, $form);
}
public function serializeFormErrorToXml(XmlSerializationVisitor $visitor, FormError $formError, array $type): \DOMCdataSection
{
return $visitor->getDocument()->createCDATASection($this->getErrorMessage($formError));
}
public function serializeFormErrorToJson(SerializationVisitorInterface $visitor, FormError $formError, array $type): string
{
return $this->getErrorMessage($formError);
}
private function getErrorMessage(FormError $error): ?string
{
if (null === $this->translator) {
return $error->getMessage();
}
if (null !== $error->getMessagePluralization()) {
if ($this->translator instanceof TranslatorContract) {
return $this->translator->trans($error->getMessageTemplate(), ['%count%' => $error->getMessagePluralization()] + $error->getMessageParameters(), $this->translationDomain);
} else {
return $this->translator->transChoice($error->getMessageTemplate(), $error->getMessagePluralization(), $error->getMessageParameters(), $this->translationDomain);
}
}
return $this->translator->trans($error->getMessageTemplate(), $error->getMessageParameters(), $this->translationDomain);
}
private function convertFormToArray(SerializationVisitorInterface $visitor, FormInterface $data): \ArrayObject
{
$form = new \ArrayObject();
$errors = [];
foreach ($data->getErrors() as $error) {
$errors[] = $this->getErrorMessage($error);
}
if ($errors) {
$form['errors'] = $errors;
}
$children = [];
foreach ($data->all() as $child) {
if ($child instanceof FormInterface) {
$children[$child->getName()] = $this->convertFormToArray($visitor, $child);
}
}
if ($children) {
$form['children'] = $children;
}
return $form;
}
}