【问题标题】:What should I pass to handleRequest class of symfony?我应该将什么传递给 symfony 的 handleRequest 类?
【发布时间】:2019-10-13 15:44:24
【问题描述】:

我正在使用这个 twig 和独立的 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 子句时出现问题。我该怎么办?

【问题讨论】:

    标签: php symfony symfony4


    【解决方案1】:

    Form 组件使用请求处理程序 (symfony docs) 来处理 handleRequest() 方法中的请求。从链接的文档:

    要处理表单数据,您需要调用handleRequest() 方法:

    $form->handleRequest();
    

    在幕后,它使用 NativeRequestHandler 对象根据表单上配置的 HTTP 方法(默认为 POST)从正确的 PHP 超全局变量(即 $_POST$_GET)中读取数据。

    如果您想使用来自 HttpFoundation 的 Request 对象,您可能需要将 Form 组件配置给我们 HttpFoundationRequestHandler。在这种情况下,您必须将 $request 参数传递给 handleRequest() 方法。

    【讨论】:

    • 现在可以了。谢谢。我知道如何用 Symfony Translator 翻译字段名,但是如何翻译约束错误消息呢? @Wouter J
    • @user4271704 搜索该问题是否尚未在此站点上得到解答,否则创建一个新问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2023-03-26
    • 2023-02-03
    • 2021-02-12
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多