现在我们有基本的 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')
@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
目录下。
你可以看到表单请求类中包含了 authorize
和 rules
方法。前者的作用是确认用户是否真的通过了授权,以便更新指定数据。
后者则是通过添加验证规则验证表单提交的数据。
如果 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 的格式,max
和 min
分别要求内容长度不得超过和少于某个长度。
更多可用的验证规则可用查阅这里 可用的验证规则
为了能处理表单提交过来的 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 来进行数据库的存储和读取以及建立模型之间的关系。还将构建显示博客的页面,并探索数据填充的意义。