Laravel 提供了几种不同的方法来验证传入应用程序的数据。默认情况下,Laravel 的控制器基类使用 ValidatesRequests trait,它提供了一种方便的方法去使用各种强大的验证规则来验证传入的 HTTP 请求。
先看段简单的验证逻辑
代码语言:javascript复制$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
使用 IlluminateHttpRequest
对象提供的 validate
方法 。如果验证通过,代码就可以正常的运行。如果验证失败,则会抛出异常,并自动将对应的错误响应返回给用户。
或者,验证规则可以指定为一个数组而不是单个 |
分隔字符串:
$validatedData = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
首次验证失败后停止运行
如果你希望在某个属性第一次验证失败后停止运行验证规则,你需要附加 bail
规则到该属性:
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
在这个例子中,如果 title
字段没有通过 unique
规则,那么程序就不会继续检查 max
规则。规则会按照分配的顺序来验证。
关于数组数据的注意实现
如果你的 HTTP 请求包含一个 「嵌套」 参数(即数组),那你可以在验证规则中通过 「点」 语法来指定这些参数:
代码语言:javascript复制$request->validate([
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
显示验证错误信息
如果传入的请求参数未通过给定的验证规则呢?正如前面所提到的,Laravel 会自动把用户重定向到之前的位置。另外,所有的验证错误信息会被自动 存储到 session。
重申一次,我们不必在 GET 路由中将错误消息显式绑定到视图。因为 Lavarel 会检查在 Session 数据中的错误信息,并自动将其绑定到视图(如果这个视图文件存在)。而其中的变量 $errors 是 IlluminateSupportMessageBag 的一个实例。
注意:
errors变量被web中间件组提供的IlluminateViewMiddlewareShareErrorsFromSession中间件绑定到视图中。当这个中间件被应用后,在你的视图中就可以获取到
error 变量 , 可以使一直假定 $errors 变量存在并且可以安全地使用。
关于可选字段的注意事项
默认情况下,在 Laravel 应用的全局中间件堆栈 AppHttpKernel 类中包含了 TrimStrings 和 ConvertEmptyStringsToNull 中间件。因此,如果你不希望验证程序将 null 值视为无效的话,那就需要将「可选」的请求字段标记为 nullable,举个例子:
代码语言:javascript复制$request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'publish_at' => 'nullable|date',
]);
指定 publish_at
字段可以为 null
或者一个有效的日期格式。如果 nullable
的修饰词没有被添加到规则定义中,验证器会认为 null
是一个无效的日期格式。
AJAX 请求 & 验证
在这个例子中,我们使用传统的表单将数据发送到应用程序。但实际情况中,很多程序都会使用 AJAX 来发送请求。当我们对 AJAX 的请求中使用 validate 方法时,Laravel 并不会生成一个重定向响应,而是会生成一个包含所有验证错误信息的 JSON 响应。这个 JSON 响应会包含一个 HTTP 状态码 422 被发送出去。