Что я должен передать классу handleRequest Symfony? - PullRequest
1 голос
/ 13 октября 2019

Я использую эту ветку и отдельную форму Symfony и компонент проверки:

use Symfony\Component\Validator\Constraints as Assert;
// other use lines ommitted to shorten the code.

$defaultFormTheme = 'bootstrap_4_horizontal_layout.html.twig';

$csrfGenerator = new UriSafeTokenGenerator();
$csrfStorage = new NativeSessionTokenStorage();
$csrfManager = new CsrfTokenManager($csrfGenerator, $csrfStorage);

$formEngine = new TwigRendererEngine([$defaultFormTheme], $twig);
$twig->addRuntimeLoader(new FactoryRuntimeLoader([
    FormRenderer::class => function () use ($formEngine, $csrfManager) {
        return new FormRenderer($formEngine, $csrfManager);
    },
]));
$twig->addExtension(new FormExtension());

$translator = new Translator('fr_FR');
$translator->addLoader('php', new \Symfony\Component\Translation\Loader\PhpFileLoader());
$translator->addResource('php', ROOT.'/translations/messages.fr.php', 'fr_FR');
$twig->addExtension(new TranslationExtension($translator));

$validator = Validation::createValidator();

$formFactory = Forms::createFormFactoryBuilder()
    ->addExtension(new CsrfExtension($csrfManager))
    ->addExtension(new ValidatorExtension($validator))
    ->getFormFactory();

$form = $formFactory->createBuilder(FormType::class, null, ['csrf_protection' => false])
    ->add('firstnameEn', TextType::class, [
            'constraints' => [new Assert\Length(['min' => 3])]
        ])
    ->add('lastnameEn', TextType::class)
    ->add('email', EmailType::class)
    ->add('birthDate', TextType::class)
    ->add('password', PasswordType::class)
    ->add('applyCard', CheckboxType::class)
    ->add('showPhoto', CheckboxType::class)
    ->add('privacyRead', CheckboxType::class)
    ->getForm();

$request = Request::createFromGlobals();
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {

   $errors = $form->getErrors();
   var_dump($errors);
   $data = $form->getErrors();
   var_dump($data);
   print("debug pring");

} else {

   $errors = $form->getErrors();
   var_dump($errors);
   $data = $form->getErrors();
   var_dump($data);
   print("debug pring");

}

echo $twig->render('signup.html', 
['form' => $form->createView(),
 'title' => 'title',
]);

Я получаю

Expected argument of type "null", "Symfony\Component\HttpFoundation\Request" given

из-за

$form->handleRequest($request);

Почему я получаю эту ошибку и как ее исправить? когда я использую только

$form->handleRequest();

, это работает, но, конечно, тогда проверка формы не работает. Как это исправить? Что я должен передать его конструктору? Я не хотел использовать его условие isSubmitted () if и не нуждался в его проверке, и я хотел использовать только для вывода формы, с которой он работал нормально. Проблема возникла, когда я хотел использовать HTTFoundation для использования isSubmitted if. Что мне делать?

1 Ответ

3 голосов
/ 13 октября 2019

Компонент Form использует обработчики запросов ( symfony docs ) для обработки запросов в методе handleRequest(). Из связанной документации:

Для обработки данных формы вам необходимо вызвать метод handleRequest():

$form->handleRequest();

За кулисами,при этом используется объект NativeRequestHandler для считывания данных с правильных суперглобальных значений PHP (т. е. $_POST или $_GET) на основе метода HTTP, настроенного в форме (по умолчанию используется POST).

Если вы хотите использовать объект Request из HttpFoundation, вы можете вместо этого настроить компонент Form для нас на HttpFoundationRequestHandler. В этом случае вы должны передать аргумент $request методу handleRequest().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...