Как проверить класс формы Symfony без данных запроса? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть страница с регистрационной формой.Форма содержит поля адреса, адрес электронной почты, пароль, а также переключатель, чтобы выбрать, хотите ли вы зарегистрироваться или войти в систему.Когда выбран «логин», поля адреса будут скрыты с помощью JS / CSS, и при отправке на сервер отправляется только электронная почта и пароль.

Серверная программа, после чего регистрируется в пользователе и загружает класс формы пользователя сданные, поступающие из базы данных.Это хорошо работает в Symfony.Но теперь я хочу проверить форму по данным, которые пришли из базы данных.Я сделал это так, но я думаю, что должен быть более простой способ:

<?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use App\Form\UserType;
use App\Entity\User;
// and more use ...

class RegisterController extends Controller
{
    /**
     * @Route("/{_locale}/register/", name="register", requirements={"_locale"="%app.locales%"})
     *
     * @param Request $request
     * @param UserPasswordEncoderInterface $encoder
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function index(Request $request, UserPasswordEncoderInterface $encoder)
    {
        $isValid = true;
        $doAccountLoginValue = 2;
        $isUserLoggedIn = $this->isGranted('IS_AUTHENTICATED_FULLY');
        $accountForm = $this->getAccountForm();
        $accountForm->handleRequest($request);

        // check if the user wants to login
        if ($accountForm->isSubmitted() &&
            $accountForm->isValid() &&
            intval($accountForm->get('login')->getData()) === $doAccountLoginValue &&
            !$isUserLoggedIn
        ) {
            if ($this->userLogin($request, $encoder)) {
                $isUserLoggedIn = true;
            } else {
                $this->addFlash(
                    'error',
                    'Login incorrect. Invalid email or password.'
                );
            }
        }
        // create the user form. When the user is logged in pass the user object to the UserType
        if ($this->getUser()) {
            $user = $this->getUser();
        } else {
            $user = new User();
        }
        $form = $this->createForm(UserType::class, $user, [
            'action' => $this->generateUrl('register'),
        ]);

        if ($isUserLoggedIn) {
            // validate manually when the user is logged in
            $form->submit([], false);
            $violationList = $this->get('validator')->validate($form);
            $isValid = (empty($violationList)) ? true : false;
            $this->addViolationMessagesToForm($violationList, $form);
        } else {
            // not logged in, so handle the request with its POST data
            $form->handleRequest($request);

            if ($form->isSubmitted()) {
                $isValid = $form->isValid();
            }
        }

        return $this->render('register/index.html.twig', [
            'form' => $form->createView(),
            'accountForm' => $accountForm->createView(),
            'isValid' => $isValid,
        ]);
    }

    private function addViolationMessagesToForm(ConstraintViolationList $violationList, FormInterface &$form)
    {
        $violationListArray = (array) $violationList;
        $violationListViolations = array_pop($violationListArray);

        foreach ($violationListViolations as $violation) {
            $property = str_replace('data.', '', $violation->getPropertyPath());
            $form->get($property)->addError(new FormError($violation->getMessage()));
        }
    }
}

Что раздражает меня в моем коде, так это часть:

// validate manually when the user is logged in
$form->submit([], false);
$violationList = $this->get('validator')->validate($form);
$isValid = (empty($violationList)) ? true : false;
$this->addViolationMessagesToForm($violationList, $form);

Разве это не легкопуть?Почему $form->submit([], false); недостаточно?Все данные уже находятся в дочерних элементах форм.

...