本文概述
- 要求
- 实现
- 总结
在本文中, 你将学习如何使用FormBuilder和SwiftMailer发送电子邮件来在Symfony 3中创建基本的联系表单。
要求
- Symfony 3。
- SwiftMailer捆绑包(通常预先安装和所有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函数发送电子邮件。
文章图片
总结
- 请注意, 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保护的情况下自己实现表单更可靠, 并且它提供了一种处理错误的简便方法。
推荐阅读
- 如何使用C#Winforms和XAMPP连接到MySQL
- 已解决–A project with an Output type of Class Library cannot be started directly
- android(如何调整对话框大小)
- Android(如何创建透明的对话框主题活动)
- Android自定义对话框大小[重复]
- 对话框按钮首次用于Android应用程序
- 如何在显示android后更改自定义对话框中的视图的可见性
- Android错误(使用对话框时无法从可绘制资源中找到ColorStateList)
- 如何在Android中的主/细分片段之间进行适当的导航()