3分钟短文:Laravel验证用户输入,不要把啥都存到系统里

时间:2022-07-25
本文章向大家介绍3分钟短文:Laravel验证用户输入,不要把啥都存到系统里,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

引言

从请求对象Request创建之后,系统开始接收用户输入数据,设计程序记住一条,永远不要相信用户的输入。你永远也想不到,用户会把什么样稀奇古怪的数据提交上来。

作为最重要的一道门槛,验证器Validator这个保安员的工作至关重要,本期就来说一说。

代码时间

假设web端有两个路由,定义在 route/web.php 文件内:

Route::get('recipes/create', 'RecipesController@create');
Route::post('recipes', 'RecipesController@store');

get请求,用于展示一个前端空白表单,给用户输入;post请求,用于更新配方数据,接收前端来的表单数据,需要写入数据库。

我们首先使用 Request 继承的 validate 方法,直接调用验证器方法, 在控制器内实现验证逻辑的代码。首先看get请求对应的方法:

public function create(){
    return view('recipes.create');}

这个就是一个视图展示,blade页面组织好表单就可以了。

重要的看一下post方法接收数据后的处理;

public function store(Request $request){
    $this->validate($request, [
        'title' => 'required|unique:recipes|max:125',
        'body' => 'required'
    ]);
    // Recipe 有效,继续其他逻辑}

简化模型,只针对两个字段 title body 进行验证。说一下几个验证规则的意义:

  • required 必填
  • unique 唯一性,要求再recipes表内,title字段唯一。如果存在则验证不通过。
  • max 字符串长度最大125

上面这个是使用了Request继承的验证方法,如果我们手动构造验证规则,如何做呢?其实, laravel提供的Validator对象,提供了众多的验证规则,验证方法,验证逻辑,只要我们进行手动实例化, 对传入的数据按规则进行整理,即可使用其特性。

为方便演示,我们在路由内直接构造。首先还是get视图路由:

Route::get('recipes/create', function () {
    return view('recipes.create');});

接着是表单提交的路由:

Route::post('recipes', function (IlluminateHttpRequest $request) {
    $validator = Validator::make($request->all(), [
        'title' => 'required|unique:recipes|max:125',
        'body' => 'required'
    ]);
    if ($validator->fails()) {
        return redirect('recipes/create')->withErrors($validator)->withInput();
    }
    // Recipe 有效,继续其他逻辑});

验证规则是统一的,上面我们已经介绍了。大家重点看一下,这里我们使用的是

Validator::make();

方法实例化验证器,并传入验证规则。而传入的需要验证的数据,使用的是

$request->all()

也就是请求体格式化之后的数组,接着对象 $validator 就可以调用验证器的方法处理了。

在验证失败时,直接进行了重定向的返回。其中redirect方法返回一个IlluminateHttpRedirectResponse对象实例, withErrors,withInput,是对象的方法,用于传递错误数据。

要手动在视图文件内展示验证错误信息,可以这样使用:

@if ($errors->any())
    <ul id="errors">
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

上面这些方法允许我们在程序内任意位置调用验证,但是逻辑写起来会有些杂乱, 有没有可能把通用的验证规则拿出来,统一进行验证呢?这样单独多出来一层逻辑, 用于专门的验证,代码结构岂不是简洁的多?

我们可以这样创建验证器:

php artisan make:request CreateCommentRequest

接下来在该验证文件内实现以下逻辑:

我们实现了两个方法,一个是 authorize 方法,用于判断用户是否有权限使用该验证器;一个是 rules 方法,返回一个由验证规则组成的数组。

声明之后在程序内调用,比如在路由内:

Route::post('comments', function (AppHttpRequestsCreateCommentRequest $request) {
    // 验证通过,处理数据})

这样代码的可读性就强的多了。

写在最后

本文通过一个post表单数据的验证,使用了多种验证方法,以满足场景需求。对于通用的验证规则, 如果能够提取出来,建议将其独立出来进行使用。这样自定义的方法较为灵活可扩展。

Happy coding :-)