今天我来分享 Laravel 中 HTTP 层关于请求、响应与表单验证的知识。
0x00 HTTP 请求
获取请求
在控制器方法中使用 Illuminate\Http\Request
类型提示,
可以以依赖注入方式来获取当前 HTTP 请求的实例。
将路由参数置于其他依赖之后可以传入路由参数。
Request 提供了内置方法来便捷地做请求相关处理。
-
path
方法返回请求路径信息。 -
is
方法验证收到的请求路径与指定规则是否匹配。 -
url
返回不带有查询字符串的 URL。 -
fullUrl
返回包含查询字符串的完整 URL。 -
method
方法返回 HTTP 请求方式。 -
isMethod
方法验证 HTTP 请求方式与指定规则是否匹配。
输入数据的预处理与规范化
在 Laravel 的全局中间件中默认包含了 TrimStrings
和 ConvertEmptyStringsToNull
两个中间件。这些中间件被列在 App\Http\Kernel
类中。它们会自动处理所有请求中传入的字符串字段,比如将空的字符串字段转变成 null 值。想停用这些功能,则需要在 App\Http\Kernel
类的 $middleware
属性中移除这些中间件。
获取输入数据
Laravel 支持从 Request 中获取常规数据、旧输入数据、cookies。
获取常规数据的方法有:
- 使用
all
方法以 数组 形式获取到所有输入数据。 - input 方法获取指定输入值。
- 通过动态属性获取输入数据。
- 通过
json
方法获取 JSON 输入信息。 - 通过
only/except
方法获取部分输入数据。 - 通过
has
方法确定是否有输入值。
对于旧数据,Laravel 允许你将本次的输入数据保留到下一次请求发送前。
这个特性在表单验证错误后重新填写表单相当有用。
文件资源
获取上传文件的相关方法:
-
file
方法获取上传的文件。 -
hasFile
方法确认上传的文件是否存在。 -
isValid
方法验证上传的文件是否有效。
UploadedFile
这个类也包含了访问文件完整路径和扩展的方法。
-
path
方法获取路径。 -
extension
方法获取扩展名。
此外,store
方法支持上传文件储存到本地磁盘或者云存储上。
0x01 HTTP 响应
所有路由和控制器都会返回一个响应并返回给用户的浏览器。
创建响应
Laravel 支持的 HTTP 响应类型包括字符串、数组、对象、附件头信息、附加 Cookie 等。
重定向
重定向响应是 Illuminate\Http\RedirectResponse
类的实例,
并且包含用户需要重定向至另一个 URL 所需的头信息。
Laravel 支持:
- 通过全局
redirect
辅助函数实现重定向。 - 通过
back
辅助函数实现重定向至上级页面。 - 重定向至命名路由,并根据需要携带普通或 Eloquent 模型参数。
- 通过
action
方法传递控制器和行为名称作为参数来实现重定向至控制器行为。 - 重定向至一个新的 URL 的同时通常会 附加 Session 闪存数据。
其他响应
使用全局辅助函数 response
可以轻松的生成其他类型的响应实例。
响应宏
自定义可以在很多路由和控制器重复使用的响应,可以使用 Response Facade 实现的 macro
方法。
0x02 表单验证机制详解
Laravel 提供了多种不同的验证方法来对应用程序传入的数据进行验证。默认情况下,Laravel 的基类控制器使用 ValidatesRequests Trait,它提供了方便的方法使用各种强大的验证规则来验证传入的 HTTP 请求数据。
快速上手实例
重点在于在控制器的方法中,添加验证逻辑。
表单请求验证
这部分与上面实例的差别在于为了满足更复杂的验证情境,我们需要创建一个表单请求。表单请求是一个自定义的请求类,里面包含着验证逻辑。想要运行验证规则,在控制器方法中利用类型提示传入请求。
在自定义的表单请求类中可以实现:
- 通过
rules
方法添加验证规则。 - 通过
withValidator
方法在表单请求以后添加钩子。 - 通过
authorize
方法授权表单请求。 - 重写 App\Http\Requests\Request 中的
formatErrors
方法来自定义错误格式。 - 重写
messages
方法自定义错误消息。
手动创建验证请求
之前的内容是直接使用 ValidatesRequests Trait 的 validate
方法来实现表单验证。此外,还可以手动创建一个 validator
实例并通过 Validator::make
方法在 Facade 生成一个新的 validator
实例来实现表单验证。
处理错误消息
调用 Validator
实例的 errors
方法,会得到一个 Illuminate\Support\MessageBag
的实例,可以对 MessageBag
进行各种处理,以满足具体的需求。
常用的错误信息相关方法:
- 通过
first
方法查看特定字段的第一个错误消息。 - 通过
get
方法查看特定字段的所有错误消息。 - 通过
all
方法查看所有字段的所有错误消息。 - 通过
has
方法判断特定字段是否含有错误消息。
自定义错误消息则主要通过传递三个参数到 Validator::make
方法来实现。
内置可用的验证规则
Laravel 内置了大量可用的验证规则。如下图:
具体用法可以查看文档:http://d.laravel-china.org/docs/5.4/validation#available-validation-rules
按条件添加规则
Laravel 还可以实现灵活的根据条件添加规则,如当字段存在时才进行验证,以及更多复杂的自定义验证规则。
验证数组
对于请求中的数组参数,可以使用型号 * 字符获取所有数组中的项。
自定义规则
除了 Laravel 内置的验证规则外,还可以根据需要自定义规则。在 服务提供者 中使用 Validator Facade 中的 extend 方法来注册自定义的验证规则。
0x03 下一步
到这篇为止,我完成了 Laravel 入门指南、核心概念、HTTP 层的路由、中间件、控制器、请求、响应、表单验证的学习和整理。这几个部分已经可以让你实现简单的面向前端的接口。
接下来我将对数据库及 ORM 部分进行学习和整理。绝大多数应用的数据都存储在数据库中,服务端的功能围绕着数据库中存储的数据展开,从而构建了强大的应用。
0x04 写在最后
对于知识的学习,整理是非常关键的一环,有助于加深理解。
对于 Laravel 的学习我将持续地以思维导图的方式整理输出,并首发在微信公众号 up2048
上分享给需要的读者。
由于思维导图在导出成图片的过程中会变得模糊,为了方便读者,我也提供了思维导图源文件的下载。读者可根据需要,关注微信公众号:up2048,并回复“脑图”来免费获取。
- EOF -