src/Transformer/JsonSchemaForm/ArrayTransformer.php line 43

  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Copyright (c) 2019 TECLA Consulting Group oü.
  5.  * All rights reserved.
  6.  *
  7.  * This unpublished material is proprietary to TECLA Consulting Group oü.
  8.  * All rights reserved. The methods and
  9.  * techniques described herein are considered trade secrets
  10.  * and/or confidential. Reproduction or distribution, in whole
  11.  * or in part, is forbidden except by express written permission
  12.  * of TECLA Consulting Group oü.
  13.  *
  14.  * @author    Matúš Sýkorjak <matus@tecla.no>
  15.  * @copyright 2019 TECLA Consulting Group oü
  16.  */
  17. namespace App\Transformer\JsonSchemaForm;
  18. use App\Exception\JsonSchemaForm\TransformerException;
  19. use App\Util\JsonSchemaForm\ResolverInterface;
  20. use Symfony\Component\Form\FormInterface;
  21. use Symfony\Component\Form\FormTypeGuesserInterface;
  22. use Symfony\Contracts\Translation\TranslatorInterface;
  23. class ArrayTransformer extends AbstractTransformer
  24. {
  25.     /**
  26.      * @var ResolverInterface
  27.      */
  28.     protected $resolver;
  29.     public function __construct(TranslatorInterface $translator, ?FormTypeGuesserInterface $validatorGuesserResolverInterface $resolver)
  30.     {
  31.         parent::__construct($translator$validatorGuesser);
  32.         $this->resolver $resolver;
  33.     }
  34.     /**
  35.      * {@inheritdoc}
  36.      */
  37.     public function transform(FormInterface $form, array $extensions = [], string $widget null): array
  38.     {
  39.         $children = [];
  40.         foreach ($form->all() as $name => $field) {
  41.             $transformerData $this->resolver->resolve($field);
  42.             $transformedChild $transformerData['transformer']->transform($field$extensions$transformerData['widget']);
  43.             $children[] = $transformedChild;
  44.             if (true === $transformerData['transformer']->isRequired($field)) {
  45.                 $required[] = $field->getName();
  46.             }
  47.         }
  48.         if (true === empty($children)) {
  49.             $entryType $form->getConfig()->getAttribute('prototype');
  50.             if (null === $entryType) {
  51.                 throw new TransformerException('Cannot infer the json-schema representation of a an empty Collection or array-like type without the option "allow_add" (to check the proptotype). Evaluating "' $form->getName() . '"');
  52.             }
  53.             $transformerData $this->resolver->resolve($entryType);
  54.             $children[] = $transformerData['transformer']->transform($entryType$extensions$transformerData['widget']);
  55.             $children[0]['title'] = 'prototype';
  56.         }
  57.         $schema = [
  58.             'type' => 'array',
  59.             'title' => $form->getConfig()->getOption('label'),
  60.             'items' => $children[0],
  61.         ];
  62.         $schema $this->addCommonSpecs($form$schema$widget$extensions);
  63.         return $schema;
  64.     }
  65. }