本文概述
对于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函数发送电子邮件。
总结
- 请注意, 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保护的情况下自己实现表单更可靠, 并且它提供了一种处理错误的简便方法。
评论前必须登录!
注册