Как получить доступ к первоначально отправленным данным формы Symfony? - PullRequest
0 голосов
/ 05 июня 2018

Я работаю с некоторыми формами Symfony и мне нужен доступ к первоначально отправленным (нетронутым) данным.Методы доступа к данным $form->getData(), $form->getViewData() и $form->getModelData() все дают мне уже преобразованные значения, но мне нужны данные, как в событии PRE_SUBMIT.

Я мог бы написать слушатель и извлечь ихна PRE_SUBMIT, но затем я должен хранить эту информацию в любом месте и обращаться к ней в своем сервисе, работая с формой.Пока мой сервис видит только переданный объект формы и работает без других зависимостей.

Другие обходные пути включают чтение из объекта запроса.Не похоже на умный вариант, потому что форма может быть заполнена из других источников (например, сеанс, это форма фильтра).

Существует ли "официальный" способ доступа к первоначально отправленным данным напрямуюиз объекта формы?Если нет, будет ли стоить запрос функции?Есть какие-либо мнения по этому поводу?

(Мой вариант использования - это форма фильтра, в которой состояние сохраняется и извлекается из сеанса. Поскольку форма может быть отправлена ​​без данных, поступающих из запроса, включающего режимы для HTML-POST,HTML-GET и JSON-POST, я не хочу просто сохранять данные запроса.)

Редактировать 2018-06-07: В соответствии с просьбой в комментариях я привожу пример кода:

/**
 * handles the filterForm request reading POST-data or namespaced JSON payload with POST method or any standard form request
 *
 * @param FormInterface $filterForm
 * @return void
 * @throws ResponseException
 */
public function handleRequest(FormInterface $filterForm): void
{
    // reset the filter state in the session, if a reset_filter query parameter was set
    if (true === $this->request->query->getBoolean('reset_filter', false)) {
        $this->setFilterState(null, $this->request->attributes->get('_route'));
        $this->filterIsActive = true;
    }

    // handle filter submission in json context
    if ($this->request->isMethod('POST') && $this->request->attributes->get('_format') === 'json') {
        if ($this->request->get($filterForm->getName())) {
            $submitData = $this->request->get($filterForm->getName());
        }
        else {
            $postData = JsonHelper::parseAndCheckJsonPostData($this->request);
            if ($postData instanceof Response) {
                throw new ResponseException($postData);
            }
            $submitData = $postData[$filterForm->getName()] ?? null;
        }
        if (null !== $submitData) {
            dump($submitData);
            $filterForm->submit($submitData, true);
            dump($filterForm->getData());
        }
    }
    else {
        // @todo find a smooth way to get the original submitted data of a form, when it is handled by the default handleRequest()-menthod
        $submitData = null;
        $filterForm->handleRequest($this->request);
    }

    // load the filter state from the session and submit it, if it is not yet set and we are in HTML context
    if (!$filterForm->isSubmitted()
        && $this->request->attributes->get('_format') === 'html'
        && null !== $this->getFilterState($this->request->attributes->get('_route'))
    ) {
        $filterForm->submit($this->getFilterState($this->request->attributes->get('_route')));
    }

    if ($filterForm->isSubmitted()) {
        $this->filterIsActive = true;

        // return an JSON error-document, if the filter form is not valid
        if (!$filterForm->isValid() && $this->request->attributes->get('_format') === 'json') {
            throw new ResponseException(
                new JsonResponse([
                    'type' => 'error',
                    'message' => $this->translator->trans('Form.Filter.errorMessage'),
                    'filterForm' => $this->serializer->normalize($filterForm->createView()),
                ], Response::HTTP_BAD_REQUEST)
            );
        }

        // store the new filter state, if filter is active and and valid
        if ($filterForm->isValid() && null !== $submitData) {
            $this->setFilterState($submitData, $this->request->attributes->get('_route'));
        }
    }
}

Выводит это:

array:4 [▼
    "singleEntity" => "1"
    "multipleEntities" => array:1 [▼
        0 => "1"
    ]
    "dateRange" => array:2 [▼
        "left_date" => "06.06.2018"
        "right_date" => "07.06.2018"
    ]
    "submit" => true
]

array:11 [▼
    "singleEntity" => MySingleEntity {#3739 ▶}
    "facilities" => ArrayCollection {#3419 ▼
        -elements: array:1 [▼
            0 => MyMultiEntity {#3799 ▶}
        ]
    }
    "createdOrUpdatedBetween" => array:2 [▼
        "left_date" => DateTime @1528236000 {#3408 ▼
            date: 2018-06-06 00:00:00.0 Europe/Berlin (+02:00)
        }
        "right_date" => DateTime @1528322400 {#3397 ▼
            date: 2018-06-07 00:00:00.0 Europe/Berlin (+02:00)
        }
    ]
]
...