У меня есть страница с регистрационной формой.Форма содержит поля адреса, адрес электронной почты, пароль, а также переключатель, чтобы выбрать, хотите ли вы зарегистрироваться или войти в систему.Когда выбран «логин», поля адреса будут скрыты с помощью 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);
недостаточно?Все данные уже находятся в дочерних элементах форм.