Laravel 验证入门
简介
Laravel提供了几种不同的方法来验证应用程序的传入数据。默认情况下,Laravel的基本控制器类使用ValidatesRequests Trait,它提供了一种方便的方法,可以使用各种功能强大的验证规则来验证传入的HTTP请求。
快速入门
要了解Laravel强大的验证功能,我们来看一个完整的示例,该示例将验证一个表单提交的数据,并将错误消息返回给用户。
定义路由
首先,假设我们在routes/web.php
文件中定义了以下路由:
Route::get('post/create', 'PostController@create');
Route::post('post', 'PostController@store');
GET路由将显示一个表单,供用户创建新博客文章,而POST路由会将新博客文章存储在数据库中。
创建控制器
接下来,让我们看一个处理这些路由的简单控制器。我们暂时先不去实现具体的 store 方法:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class PostController extends Controller
{
/**
* Show the form to create a new blog post.
*
* @return Response
*/
public function create()
{
return view('post.create');
}
/**
* Store a new blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// Validate and store the blog post...
}
}
编写验证逻辑
现在,我们来实现store方法,该方法主要用来验证新提交的博客文章的数据是否满足我们定义的逻辑。为此,我们将使用Illuminate\Http\Request
实例的validate
方法。如果验证规则通过,代码将继续正常执行;否则,代码将不会向下再执行。但是,如果验证失败,则会引发异常,并且会返回给用户相应的错误Response。对于传统的HTTP请求,将生成重定向响应,而将为AJAX请求发送JSON响应。
为了更好地理解validate
方法,让我们跳回到store方法:
/**
* Store a new blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// The blog post is valid...
}
如您所见,我们将所需的验证规则传递给该validate方法。同样,如果验证失败,则会自动生成相对应的Response。如果验证通过,我们的控制器将继续正常执行。
或者,可以将验证规则指定为规则数组,而不是单个|定界字符串:
$validatedData = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
我们可以使用validateWithBag
方法来验证请求并将任何错误消息存储在命名错误包中:
$validatedData = $request->validateWithBag('post', [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
在首次验证失败时停止
有时,我们可能希望在第一次验证失败后就不再验证其他的规则。为此,可以在规则前面加上bail
,并用|
和后面的规则隔开:
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
在此示例中,如果title上的属性unique上验证失败,那么后面的max属性也不再会被检查。规则将按照分配的顺序进行验证。
关于嵌套属性的说明
如果HTTP请求包含“嵌套”参数,则可以在验证规则中使用“.”语法指定它们:
$request->validate([
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
显示验证错误
那么,如果传入的请求参数未通过给定的验证规则怎么办?如前所述,Laravel将自动将用户重定向回其先前的位置。此外,所有验证错误将自动存储到session。
同样,请注意,我们不必在GET路由中将错误消息显式绑定到视图。这是因为Laravel将检查会话数据中的错误,并将错误自动绑定到视图(如果有)。$errors
变量是Illuminate\Support\MessageBag
类的一个实例。有关使用此对象的更多信息,请查阅其文档。
$errors
变量由Illuminate\View\Middleware\ShareErrorsFromSession
中间件绑定到视图,中间件由web中间件组提供。应用此中间件时,$errors变量将始终在我们的视图中可用。
因此,在我们的示例中,当验证失败时,用户会被重定向到create
方法,从而使我们能够在视图中显示错误消息:
<!-- /resources/views/post/create.blade.php -->
<h1>Create Post</h1>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<!-- Create Post Form -->
@error指令
我们也可以使用@error Blade
指令快速检查给定属性的验证错误消息。在@error
指令中,我们可以通过输出$message
变量来显示错误消息:
<!-- /resources/views/post/create.blade.php -->
<label for="title">Post Title</label>
<input id="title" type="text" class="@error('title') is-invalid @enderror">
@error('title')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
关于可选字段的注释
默认情况下,Laravel在应用程序的全局中间件堆栈中包含有TrimStrings
和ConvertEmptyStringsToNull
中间件。这些中间件在App\Http\Kernel
中列出。因此,我们通常需要标记一些的“可选”请求字段允许为空,通过在规则前面加上nullable
就可以实现此效果。例如:
$request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'publish_at' => 'nullable|date',
]);
在此示例中,我们指定该publish_at字段可以是null。如果未将nullable修饰符添加到规则定义,则验证器将认为null是无效的。
AJAX请求和验证
在此示例中,我们使用传统形式将数据发送到应用程序。但是,许多应用程序都使用AJAX请求。在AJAX请求期间使用validate
方法时,Laravel将不会生成重定向响应。相反,Laravel会生成一个包含所有验证错误的JSON响应。该JSON响应将以422 HTTP状态码发送回去。