larablog 系列文章 02 - 联系页面:表单请求和发送邮件

现在我们有基本的 HTML 页面布局,接下来我们将从最简单的页面(联系页面)开始。在完成本章内容后,将会有一个联系页面,用户可以向管理员提交联系信息,这些联系信息将会通过电子邮件发送给管理员。

联系页面

配置路由

与我们第一章最后关于页面一样,我们先从定义路由信息开始。打开位于 app/Http/routes.php,附加以下内容:

Route::get('/contact', 'PageController@contact')->name('contact');

和之前的配置没什么区别,它将匹配通过 HTTP GET 请求的 /contact 路径,执行 Page 控制的 contact 方法。

控制器

接下来给位于 app/Htpp/Controllers/PageController.php 添加处理联系页的控制器方法。

public function contact()
{
    return view('pages.contact');
}

这个控制器方法目前比较简单,仅仅是渲染联系页面的视图。稍后我们将回到控制器再做调整。

视图

创建的联系页面,文件位于 resources/views/pages/contact.blade.php,并附加如下内容:

@extends('layouts.app')

@section('title', 'Contact')

@section('body')
    

Contact larablog

Want to contact larablog?

@endsection

这是一个简单的模板,它继承基础视图,重新覆盖了标题和内容块。

页面链接

接下来,我们将修改基础布局,好通过页面上的入口访问到该页面。

@section('navigation')
    
@show

你如果你通过浏览器访问 http://localhost:8000/ 点击导航上的 Contact 的链接,这个简单的页面就会呈现在你的眼前。
现在我们应该更进一步,我们将为这个页面添加一个提交联系信息的表单。分为两个部分来完成,提交表单请求和处理表单。在此之前我们需要先考虑如何正确处理联系人的信息。

表单

接下来我们将创建表单相关的内容。

表单视图

打开基础视图 resources/views/layouts/app.blade.php,更改 stylesheets 部分的内容:

@section('stylesheets')
    
    
@show

stylesheets 内容块可以看到,我们引入了新的 CSS 样式表,blog.css 位于 public/css/blog.css。其内容如下:

.blogger-notice { text-align: center; padding: 10px; background: #DFF2BF; border: 1px solid; color: #4F8A10; margin-bottom: 10px; }
form.blogger { font-size: 16px; }
form.blogger div { clear: left; margin-bottom: 10px; }
form.blogger label { float: left; margin-right: 10px; text-align: right; width: 100px; font-weight: bold; vertical-align: top; padding-top: 10px; }
form.blogger input[type="text"],
form.blogger input[type="email"]
    { width: 500px; line-height: 26px; font-size: 20px; min-height: 26px; }
form.blogger textarea { width: 500px; height: 150px; line-height: 26px; font-size: 20px; }
form.blogger input[type="submit"] { margin-left: 110px; width: 508px; line-height: 26px; font-size: 20px; min-height: 26px; }
form.blogger ul li { color: #ff0000; margin-bottom: 5px; }

接下来,我们要更改 resources/views/pages/contact.blade.php 文件,将其内容替换为:

@extends('layouts.app')

@section('title', 'Contact')

@section('body')
    

Contact larablog

Want to contact larablog?

@include('partials.success') @include('partials.errors')

{!! csrf_field() !!}
@endsection

另外,我们通过 @include('partials.errors')@include('partials.success') 嵌入了一个局部视图片段,用于显示表单提交出现错误或成功时的提示信息。

文件 resources/views/partials/errors.blade.php 的内容如下:

@if (count($errors) > 0)
    
@if (count($errors) > 1)
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@else {{ $errors->all()[0] }} @endif
@endif

而文件 resources/views/partials/success.blade.php 的内容如下:

@if (Session::has('message'))
    
{{ Session::get('message') }}
@endif

打开浏览器访问 http://localhost:8000/contact 页面,就可以看到我们构建好的表单页面。
我们只是构建并显示表单,接下来我们要进行表单请求验证和处理表单了。

处理表单请求

命令行下进入项目所在目录,执行如下命令:

php artisan make:request EnquiryRequest

该命令会创建一个表单请求类 EnquiryRequest.php,新生成的类文件会被放在 app/Http/Requests 目录下。

你可以看到表单请求类中包含了 authorizerules 方法。前者的作用是确认用户是否真的通过了授权,以便更新指定数据。
后者则是通过添加验证规则验证表单提交的数据。

如果 authorize 方法返回 false,则会自动返回一个 HTTP 响应,其中包含 403 状态码,而你的控制器方法也将不会被运行。
如果你打算在应用程序的其它部分处理授权逻辑,只需从 authorize 方法返回 true。
更多内容可以查阅文档 表单请求验证

编辑这个文件 app/Http/Requests/EnquiryRequest.php,修改内容为如下:

 'required',
            'email' => 'required|email',
            'subject' => 'required|max:50',
            'body' => 'required|min:50'
        ];
    }
}

我们在 rules 方法中给提交的表单数据定义了验证规则,我想这些规则已经很直观的表达了验证内容,required 要求为内容为必填,
email 要求内容符合 Email 的格式,maxmin 分别要求内容长度不得超过和少于某个长度。

更多可用的验证规则可用查阅这里 可用的验证规则

为了能处理表单提交过来的 POST 请求,接下来我们需要修改路由配置,打开 app/Http/routes.php,添加如下内容:

Route::post('/contact', 'PageController@postContact');

紧接着,打开 app/Http/Controllers/PageController.php 增加新的控制器方法 postContact

现在访问 http://localhost:8000/contact 提交表单,如果填写的内容不符合验证要求将会显示错误信息。
由于我们暂时还未对提交的表单数据做最终的处理,所以就算用户提交的表单有效暂时也不会发生什么。

发送电子邮件

虽然我们的联系表单允许用户提交表单,但实际上还没有发生任何事情。让我们更新控制器,让用户提交表单后向博客网站管理员发送一封电子邮件。

配置邮件服务

Laravel 基于热门的 SwiftMailer 函数库提供了一套简洁的 API。Laravel 为 SMTP、Mailgun、Mandrill、Amazon SES、PHP 的 mail 函数及 sendmail 提供驱动,让你可以从本地或云端服务自由地发送邮件。

虽然支持这么多邮件驱动,但是我们这里会用能够容易实现的办法,会基于 SMTP 驱动,使用 126 的邮箱的来演示。

并非你一定得用 126 的邮箱,只要你能够获得邮箱提供商的 SMTP 配置参数(服务器、端口、认证方式)进行设置即可。

打开项目目录下的 .env 文件,找到这部分的内容修改如下:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.126.com
MAIL_PORT=25
MAIL_USERNAME=126邮箱账号
MAIL_PASSWORD=邮箱密码
MAIL_ENCRYPTION=null

回到控制器 app/Http/Controllers/PageController.php 中,修改 postContact 方法:

$flag = Mail::send('emails.enquiry', [
        'name'=> $request->get('name'),
        'email' => $request->get('email'),
        'subject' => $request->get('subject'),
        'body' => $request->get('body')
    ], function($message){
    $message->from('{126邮箱地址}', 'larablog');
    $message->to('{想要收信的邮箱地址}')->subject('Enquiry');
});

if ($flag) {
    return redirect()->back()->with('message', 'Mail sent successfully. Thank you!');
} else {
    return redirect()->back()->withErrors('Sending mail failed, please try again.');
}

注意:这里需要用到你自己的邮箱

另外这里的 emails.enquiry 是邮件内容的模板,文件位于 resources/views/emails/enquiry.blade.php
内容如下:

A contact enquiry was made by {{ $name }} at {{ \Carbon\Carbon::now()->format('Y-m-d H:i:s') }}.
Reply-To: {{ $email }}
Subject: {{ $subject }}
Body:
{{ $body }}

我们提供了模板的方式来编排邮件的内容,这看上去能更好的组织内容。

如果你想了解更多的关于 Laravel 当中发送邮件的信息可以查阅这里 邮件

至此,我们可以通过浏览器访问 http://localhost:8000/contact 。你可以尝试提交表单信息并接收邮件,体会我们实践的每个过程。

总结

我们已经展示了创建网站最基本内容一的表单功能。通过这个部分的内容可以看到,Laravel 提供了很好的处理表单请求的方案,包括认证和数据验证。这让我们在控制器中的代码显得比较干净利落。我们还提到了怎么通过 Laravel 内置的邮件驱动对接你所需要的邮件功能,并发送邮件。

接下来,我们将探讨“模型”这个部分,将介绍如何运用 ORM 来进行数据库的存储和读取以及建立模型之间的关系。还将构建显示博客的页面,并探索数据填充的意义。

你可能感兴趣的:(larablog 系列文章 02 - 联系页面:表单请求和发送邮件)