验证
由 学院君 创建于5年前, 最后更新于 8个月前
版本号 #3
1、简介
Laravel提供了多种方法来验证应用输入数据。默认情况下,Laravel的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验证规则来验证输入的HTTP请求。
2、快速入门
要学习Laravel强大的验证特性,让我们先看一个完整的验证表单并返回错误信息给用户的例子。
2.1 定义路由
首先,我们假定在app/Http/routes.php文件中包含如下路由:
// 显示创建博客文章表单...
Route::get('post/create', 'PostController@create');
// 存储新的博客文章...
Route::post('post', 'PostController@store');
当然,GET路由为用户显示了一个创建新的博客文章的表单,POST路由将新的博客文章存储到数据库。
2.2 创建控制器
接下来,让我们看一个处理这些路由的简单控制器示例。我们先将store方法留空:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PostController extends Controller{
/**
* 显示创建新的博客文章的表单
*
* @return Response
*/
public function create()
{
return view('post.create');
}
/**
* 存储新的博客文章
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// 验证并存储博客文章...
}
}
2.3 编写验证逻辑
现在我们准备用验证新博客文章输入的逻辑填充store方法。如果你检查应用的控制器基类(App\Http\Controllers\Controller),你会发现该类使用了ValidatesRequests trait,这个trait在所有控制器中提供了一个便利的validate方法。
validate方法接收一个HTTP请求输入数据和验证规则,如果验证规则通过,代码将会继续往下执行;然而,如果验证失败,将会抛出一个异常,相应的错误响应也会自动发送给用户。在一个传统的HTTP请求案例中,将会生成一个重定向响应,如果是AJAX请求则会返回一个JSON响应。
要更好的理解validate方法,让我们回到store方法:
/**
* 存储博客文章
*
* @param Request $request
* @return Response
*/
public function store(Request $request){
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// 验证通过,存储到数据库...
}
正如你所看到的,我们只是传递输入的HTTP请求和期望的验证规则到validate方法,在强调一次,如果验证失败,相应的响应会自动生成。如果验证通过,控制器将会继续正常执行。
2.3.1 嵌套属性注意事项
如果HTTP请求中包含“嵌套”参数,可以使用“.”在验证规则中指定它们:
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
2.4 显示验证错误信息
那么,如果请求输入参数没有通过给定验证规则怎么办?正如前面所提到的,Laravel将会自动将用户重定向回上一个位置。此外,所有验证错误信息会自动一次性存放到session。
注意我们并没有在GET路由中明确绑定错误信息到视图。这是因为Laravel总是从session数据中检查错误信息,而且如果有的话会自动将其绑定到视图。所以,值得注意的是每次请求的所有视图中总是存在一个$errors变量,从而允许你在视图中方便而又安全地使用。$errors变量是的一个Illuminate\Support\MessageBag实例。想要了解更多关于该对象的信息,查看其文档。
所以,在我们的例子中,验证失败的话用户将会被重定向到控制器的create方法,从而允许我们在视图中显示错误信息:
Create Post
@if (count($errors) > 0)
@foreach ($errors->all() as $error)
{ { $error }}@endforeach
@endif
2.5 AJAX请求&验证
在这个例子中,我们使用传统的表单来发送数据到应用。然而,很多应用使用AJAX请求。在AJAX请求中使用validate方法时,Laravel不会生成重定向响应。取而代之的,Laravel生成一个包含验证错误信息的JSON响应。该JSON响应会带上一个HTTP状态码422。