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

本文概述

  • 要求
  • 实现
  • 总结
【在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.phpnamespace 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="http://www.srcmini.com/Submit"> {{ form_end(form) }}

创建控制器
现在, 这是本教程中最重要的一点, 即处理我们表单的控制器。
和往常一样, 你在控制器中的操作应该在routing.yml文件中已经有一个路径, 并且它的目标是:
myapplication_contact:path:/contactdefaults: { _controller: myBundle:Default:contact }

最后, 我们的控制器(带有接触动作)应如下所示:
< ?phpnamespace 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 mailif($this-> sendEmail($form-> getData())){// Everything OK, redirect to wherever you want ! :return $this-> redirectToRoute('redirect_to_somewhere_now'); }else{// An error ocurred, handlevar_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函数发送电子邮件。
在Symfony 3中使用FormType创建一个简单的联系表单

文章图片
总结
  • 请注意, 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保护的情况下自己实现表单更可靠, 并且它提供了一种处理错误的简便方法。

    推荐阅读