资讯专栏INFORMATION COLUMN

Laravel 学习笔记之 request validation

imingyu / 1731人阅读

摘要:对于这样嵌套的,使用来校验对象间关系很重要,可以看做是进入核心业务逻辑前的初步校验。。当然最后写表时还有,避免坏数据进入。,总之,在写程序时,很重要,需要去写,包括和。。。

在用laravel写api时,当前端传进来的request是POST/PUT/PATH等method时,那需要做request validation,尽管对于前后端分离程序,前端程序Angular/Vue已经做了validation,但是ajax传过来的json input,在后端也需要做validation。

那该如何优雅的编写request validation呢?laravel官方文档已经包含了这个feature: Form Request Validation

这里可以写一个JsonRequest:

class JsonRequest extends IlluminateFoundationHttpFormRequest
{
    public function rules()
    {
        $method = $this->method();
        
        assert(in_array($method, [static::METHOD_POST, static::METHOD_PUT, static::METHOD_PATCH], true));
        
        $controller = $this->route()->getController();
        $rules      = $controller::RULES;

        return ($rules[$this->method()] ?? []) + ($rules["*"] ?? []);
    }

    public function authorize()
    {
        return true;
    }
}

这样就可以在众多Model Controller里使用JsonRequest就行,如:

use IlluminateHttpRequest;

final class AccountController extends AppHttpControllersController
{
    public const RULES = [
        Request::METHOD_POST => [
            "bank_account" => "required_if:type,bank",
            "loan_account" => "required_if:type,loan",
        ],
        Request::METHOD_PUT => [
            // ...
        ],
        "*" => [
            // ...
        ],
    ];
}

这样就可以校验前端传进来的json input是否合法。
(1)如果前端传进来的json input是:

{
    "name": "lx1036",
    "type": "loan",
    "bank_account": {
        "source": "bank",
    }
}

那就validation失败,不合法。
(2) 如果前端传进来的json input是:

{
    "name": "lx1036",
    "type": "bank",
    "loan_account": {
        "source": "loan",
    }
}

那就validation失败,不合法。

这样就可以校验json input,不合法就直接弹回throw 一个HttpException,不再用在进入下一步逻辑。对于这样嵌套的json input,使用request validation来校验对象间关系很重要,可以看做是进入核心业务逻辑前的初步校验。。当然最后写表时还有model validation,避免坏数据进入db。

最后一点,laravel文档只是说了用法,没有说明原理。代码在IlluminateFoundationProvidersFormRequestServiceProvider::class:

    public function boot()
    {
        // IlluminateFoundationHttpFormRequest use 了 ValidatesWhenResolvedTrait,extends 了 IlluminateContractsValidationValidatesWhenResolved
        $this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) {
            $resolved->validate();
        });

        // ...
    }

所以当从容器中resolve完IlluminateFoundationHttpFormRequest后就会立即执行IlluminateFoundationHttpFormRequest::validate()方法,具体不详述,可看laravel源码。

OK,总之,在写程序时,validation很重要,需要去写,包括request validation和model validation。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30693.html

相关文章

  • Laravel 学习笔记 model validation

    摘要:在或自定义一个中写上是表示所有的,即任何一个的写操作都会触发该事件。这里业务不同,不同,不做过多解释。这个的目的主要是从逻辑上校验输入数据的合法性。,总之一般情况下,在写数据库前都需要做,避免无效。 在对database进行写操作前,需要对数据进行validation,如type-check 每一个 model column 的定义(type 这个column必须是enum(card,...

    diabloneo 评论0 收藏0
  • Laravel学习笔记bootstrap源码解析

    摘要:总结本文主要学习了启动时做的七步准备工作环境检测配置加载日志配置异常处理注册注册启动。 说明:Laravel在把Request通过管道Pipeline送入中间件Middleware和路由Router之前,还做了程序的启动Bootstrap工作,本文主要学习相关源码,看看Laravel启动程序做了哪些具体工作,并将个人的研究心得分享出来,希望对别人有所帮助。Laravel在入口index...

    xiaoxiaozi 评论0 收藏0
  • Laravel学习笔记Middleware源码解析

    摘要:学习笔记之已经聊过使用了来设计,看源码发现其巧妙用了和的一些数组函数来设计。开发环境内置函数和看源码之前,先看下这几个内置函数的使用。学习笔记之实例化源码解析已经聊过的实例化,得到中的变量,即的实例化对象。后面再学习下的源码,到时见。 说明:本文主要学习Laravel的Middleware的源码设计思想,并将学习心得分享出来,希望对别人有所帮助。Laravel学习笔记之Decorato...

    _Dreams 评论0 收藏0
  • Laravel学习笔记Session源码解析(上)

    摘要:然后中间件使用方法来启动获取实例,使用类来管理主要分为两步获取实例,主要步骤是通过该实例从存储介质中读取该次请求所需要的数据,主要步骤是。 说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助。Laravel在web middleware中定义了session中间件IlluminateSess...

    NervosNetwork 评论0 收藏0
  • Laravel学习笔记Session源码解析(中)

    摘要:说明在上篇中学习了的启动过程,主要分为两步,一是的实例化,即的实例化二是从存储介质中读取的数据。第二步就是操作,包括对数据的增删改查操作,本文也主要聊下相关操作源码。下篇再学习下关闭,到时见。 说明:在上篇中学习了session的启动过程,主要分为两步,一是session的实例化,即IlluminateSessionStore的实例化;二是从session存储介质redis中读取id ...

    longshengwang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<