个性化阅读
专注于IT技术分析

在Symfony 3中使用FormType创建一个简单的联系表单

本文概述

对于Web开发人员来说, 处理HTML表单是最常见且最具挑战性的任务之一。 Symfony集成了一个Form组件, 使处理表单变得容易。

在本文中, 你将学习如何使用FormBuilder和SwiftMailer发送电子邮件来在Symfony 3中创建基本的联系表单。

要求

  • Symfony 3。
  • SwiftMailer捆绑包(通常预先安装和所有symfony发行版)。

实现

鼓励使用FormType, 因为它是使用Symfony时的正确工作流程。这将帮助你轻松地处理错误, 属性的自定义。

为联系表单创建一个FormType

下列类包含ContactType类, 该类稍后将用于在控制器中创建表单。

<?php
// your-path-to-types/ContactType.php

namespace myapplication\myBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;

class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, array('attr' => array('placeholder' => 'Your name'), 'constraints' => array(
                    new NotBlank(array("message" => "Please provide your name")), )
            ))
            ->add('subject', TextType::class, array('attr' => array('placeholder' => 'Subject'), 'constraints' => array(
                    new NotBlank(array("message" => "Please give a Subject")), )
            ))
            ->add('email', EmailType::class, array('attr' => array('placeholder' => 'Your email address'), 'constraints' => array(
                    new NotBlank(array("message" => "Please provide a valid email")), new Email(array("message" => "Your email doesn't seems to be valid")), )
            ))
            ->add('message', TextareaType::class, array('attr' => array('placeholder' => 'Your message here'), 'constraints' => array(
                    new NotBlank(array("message" => "Please provide a message here")), )
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'error_bubbling' => true
        ));
    }

    public function getName()
    {
        return 'contact_form';
    }
}

注意:根据你的包中FormType的位置更改名称空间, 并将其保存以在下一步中使用。

在Twig中创建视图

现在, 视图(在这种情况下将通过树枝渲染)应该是测试的基础:

{# contact.html.twig #}

{{ form_start(form) }}

    <div>
        {{ form_widget(form.subject) }}
        {{ form_errors(form.subject) }}
    </div>
    <div>
        {{ form_widget(form.name) }}
        {{ form_errors(form.name) }}
    </div>
    <div>
        {{ form_widget(form.email) }}
        {{ form_errors(form.email) }}
    </div>
    <div>
        {{ form_widget(form.message) }}
        {{ form_errors(form.message) }}
    </div>

    {# Render CSRF token etc .#}
    <div style="display:none">
        {{ form_rest(form) }}
    </div>
    
    <input type="submit" value="Submit">
    
{{ form_end(form) }}

创建控制器

现在, 这是本教程中最重要的一点, 即处理我们表单的控制器。

和往常一样, 你在控制器中的操作应该在routing.yml文件中已经有一个路径, 并且它的目标是:

myapplication_contact:
    path:     /contact
    defaults: { _controller: myBundle:Default:contact }

最后, 我们的控制器(带有接触动作)应如下所示:

<?php

namespace myapplication\myBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    public function contactAction(Request $request)
    {
        // Create the form according to the FormType created previously.
        // And give the proper parameters
        $form = $this->createForm('myapplication\myBundle\Form\ContactType', null, array(
            // To set the action use $this->generateUrl('route_identifier')
            'action' => $this->generateUrl('myapplication_contact'), 'method' => 'POST'
        ));

        if ($request->isMethod('POST')) {
            // Refill the fields in case the form is not valid.
            $form->handleRequest($request);

            if($form->isValid()){
                // Send mail
                if($this->sendEmail($form->getData())){

                    // Everything OK, redirect to wherever you want ! :
                    
                    return $this->redirectToRoute('redirect_to_somewhere_now');
                }else{
                    // An error ocurred, handle
                    var_dump("Errooooor :(");
                }
            }
        }

        return $this->render('myBundle:Default:contact.html.twig', array(
            'form' => $form->createView()
        ));
    }

    private function sendEmail($data){
        $myappContactMail = 'mycontactmail@mymail.com';
        $myappContactPassword = 'yourmailpassword';
        
        // In this case we'll use the ZOHO mail services.
        // If your service is another, then read the following article to know which smpt code to use and which port
        // http://ourcodeworld.com/articles/read/14/swiftmailer-send-mails-from-php-easily-and-effortlessly
        $transport = \Swift_SmtpTransport::newInstance('smtp.zoho.com', 465, 'ssl')
            ->setUsername($myappContactMail)
            ->setPassword($myappContactPassword);

        $mailer = \Swift_Mailer::newInstance($transport);
        
        $message = \Swift_Message::newInstance("Our Code World Contact Form ". $data["subject"])
        ->setFrom(array($myappContactMail => "Message by ".$data["name"]))
        ->setTo(array(
            $myappContactMail => $myappContactMail
        ))
        ->setBody($data["message"]."<br>ContactMail :".$data["email"]);
        
        return $mailer->send($message);
    }
}

contactAction是正常且典型的symfony 3形式。它验证表单是否已使用POST方法提交, 然后检查ContactType中给定的约束是否正确。如果有效, 请继续使用sendEmail函数发送电子邮件。

FormType symfony 3

总结

  • 请注意, sendEmail函数是SwiftMailer的直接实现。我们刚刚在Zoho Mail中使用了该实现, 如果你使用其他电子邮件提供商, 则需要更改SMTP地址并检查你的服务是否需要SSL。你可以在本文中了解如何将邮件从SwiftMailer发送到其他电子邮件提供商。在此功能中, 你只需要更改mail变量和密码, 你将收到一封与接收方向相同的电子邮件(mymail@mail.com发送至mymail@mail.com)。
  • 你可以轻松地在FormType中向表单添加更多字段, 以在sendEmail函数(从$ form-> getData变成数组)中检索它们, 使用它的键值。
  • 如果你想防止机器人等行为, 也可以在表单中使用Google Recaptcha。阅读以下文章, 了解如何以Symfony 3表单实现Recaptcha。
  • Symfony Form组件的使用比没有CSRF保护的情况下自己实现表单更可靠, 并且它提供了一种处理错误的简便方法。
赞(0)
未经允许不得转载:srcmini » 在Symfony 3中使用FormType创建一个简单的联系表单

评论 抢沙发

评论前必须登录!