首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony5:对所有模板进行表单处理

Symfony5:对所有模板进行表单处理
EN

Stack Overflow用户
提问于 2021-05-19 20:32:10
回答 2查看 18关注 0票数 0

我想要一个关于所有模板的表格。对于显示器,我没有任何担心。我使用一个控制器,并将动作集成到基本模板(通常是base.html.twig)中。下面是控制器的操作:

代码语言:javascript
复制
public function showForm(Request $request)
{
    $form = $this->createForm(LetsTalkType::class);
    $form->handleRequest($request);
    return $this->render('_lets_talk.html.twig', array('form' => $form->createView()));
}

下面是与模板的集成:

代码语言:javascript
复制
{{render(controller('App\\Controller\\LetsTalkController::showForm')) }}

问题是对于每个控制器(PostController、ServiceController、PortfolioController等)我必须添加一段代码来检查表单是否已发送并有效,然后调用LestsTalkController控制器的操作,如下所示:

代码语言:javascript
复制
  public function show($slug, Request $request,  LetsTalkController $letsTalkController, MailerInterface $mailer)
    {
        
        $letsTalk = new LetsTalk();
        $letsTalkForm = $this->createForm(LetsTalkType::class);
        $letsTalkForm->handleRequest($request);
        if ($letsTalkForm->isSubmitted() && $letsTalkForm->isValid()) {
                $letsTalkController->sendEmail($letsTalkForm, $request, $mailer);
        }
}

没有避免在所有控制器上编写代码的解决方案吗?感谢您的回复:)。

EN

回答 2

Stack Overflow用户

发布于 2021-05-26 01:48:15

更好的方法是将表单的操作设置为将其发送到单个控制器/操作

代码语言:javascript
复制
<?php
class ContactFormController extends AbstractController
{
    /**
     * @Route("/contact-form", name="contact_form")
     */
    public function index(Request $request = null, EmailService $email)
    {
        $formEntity = new LetsTalk();
        $form = $this->createForm(LetsTalkType::class, $formEntity, [
            'action' => $this->generateUrl('contact_form'), // set action here to post form to
            'method' => 'POST',
        ]);
        
        if (null !== $request && $request->isMethod('POST')) {
            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
                $formEntity = $form->getData();

                ...

                $email->sendNewContact($formEntity); // or watever
                
                return $this->redirect($request->headers->get('referer')); // redirect to previous page
            }
        }

        return $this->render('_lets_talk.html.twig', [
            'form' => $form->createView(),
        ]);
    }
}

然后,您可以按照您所做的那样呈现窗体

票数 1
EN

Stack Overflow用户

发布于 2021-05-19 22:03:31

我找到了我的错误。我把它放在下面,因为它可能对处于相同情况的人有用。对于模板中包含的控制器:

代码语言:javascript
复制
{{render(controller('App\\Controller\\LetsTalkController::letsTalkForm', {request: app.request})) }}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67603333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档