牛骨文教育服务平台(让学习变的简单)

表单请求验证

如果是更复杂的验证场景,你可能需要创建一个"表单请求"。表单请求是一个自定义的请求类包含了一些验证的逻辑。你可以通过 Artisan 的命令行 make:request 来创建一个表单请求类。

php artisan make:request StoreBlogPostRequest

生成的类会放置在 app/Http/Requests 目录中。 我们在 rules 方法中增加一些验证规则:

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        "title" => "required|unique|max:255",
        "body" => "required",
    ];
}

那么,我们的验证规则是怎么执行的呢?你所要做的只是在控制器方法中加上请求的类型提示:

/**
 * Store the incoming blog post.
 *
 * @param  StoreBlogPostRequest  $request
 * @return Response
 */
public function store(StoreBlogPostRequest $request)
{
    // The incoming request is valid...
}

当控制器的方法被调用前,表单请求已经验证了,意味着你不需要在控制器里写任何的验证逻辑。它已经验证完了!

如果验证失败,用户会收到一个重定向请求至上一个页面。而错误信息也已经存储至 session 中方便视图展示。如果收到的是一个 AJAX 请求,一个带有 422 状态码的 HTTP 响应会被返回给浏览器,包含了一个含有错误信息的 JSON 对象。

授权表单请求

表单请求类同样也包含了一个 authorize 方法。通过这个方法,你可以检查认证后的用户是否有权限去更新一个已有的资源。比如,如果一个用户尝试去更新一篇博客的评论,他是否真的发布过这个评论?举个例子:

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    $commentId = $this->route("comment");

    return Comment::where("id", $commentId)
                  ->where("user_id", Auth::id())->exists();
}

注意上面例子中调用的 route 方法。这个方法允许你获取调用路由中定义的 URI 参数,比如下面例子中的 {comment} 参数:

Route::post("comment/{comment}");

如果 authorize 方法返回 false, 一个带有 403 状态码的 HTTP 响应会被返回给浏览器,你控制器的方法也不会被执行。

如果你打算在应用的其他地方做一些权限的逻辑,在 authorize 方法中返回 true 即可:

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return true;
}

自定义闪存后的错误信息格式

如果你想要自定义验证失败后已经闪存至 session 的错误消息格式,可以通过覆盖基类请求类(AppHttpRequestsRequest)的 formatErrors。不要忘记在文件顶部引入 IlluminateValidationValidator 类:

/**
 * {@inheritdoc}
 */
protected function formatErrors(Validator $validator)
{
    return $validator->errors()->all();
}