使用laravel写api时,当前端传入的请求是POST/PUT/PATH等方法时,需要做请求校验,虽然对于前端和后端分离程序,前端程序Angular/VueValidation已经做好了,但是ajax传入的json输入还需要在后端进行校验。那么如何优雅的写请求校验呢?laravel官方文档已经包含了这个功能:FormRequestValidation在这里你可以写一个JsonRequest:assert(in_array($method,[static::METHOD_POST,static::METHOD_PUT,static::METHOD_PATCH],true));$controller=$this->route()->getController();$rules=$controller::RULES;返回($rules[$this->method()]??[])+($rules['*']??[]);}publicfunctionauthorize(){返回真;}}这样很多Model在Controller中使用JsonRequest就可以了,比如:useIlluminate\Http\Request;最终类AccountController扩展\App\Http\Controllers\Controller{publicconstRULES=[Request::METHOD_POST=>['bank_account'=>'required_if:type,bank','loan_account'=>'required_if:type,loan',],请求::METHOD_PUT=>[//...],'*'=>[//...],];}这样就可以验证前端传入的json输入是否合法(1)如果json输入通过infromfrontendis:{"name":"lx1036","type":"loan","bank_account":{"source":"bank",}}然后验证失败,是非法的。(2)如果前端传入的json输入为:{"name":"lx1036","type":"bank","loan_account":{"source":"loan",}},则验证失败,不合法。这样就可以对json输入进行校验,如果不合法则直接抛出HttpException,不再用于进入下一步逻辑。对于这种嵌套的json输入,使用请求校验来校验对象之间的关系是非常重要的,可以看作是进入核心业务逻辑之前的初步校验。.当然最后写表的时候也有modelvalidation,防止坏数据进入db。最后一点,laravel文档只讲用法,不讲原理。代码在\Illuminate\Foundation\Providers\FormRequestServiceProvider::class:publicfunctionboot(){//\Illuminate\Foundation\Http\FormRequest使用ValidatesWhenResolvedTrait,extends\Illuminate\Contracts\Validation\ValidatesWhenResolved$this->app->afterResolving(ValidatesWhenResolved::class,function($resolved){$resolved->validate();});//...}所以当\Illuminate\Foundation\Http\FormRequest从容器中解析出来后,会立即执行\Illuminate\Foundation\Http\FormRequest::validate()方法,具体不详述,大家可以查看laravel的源代码。OK,总之,写程序的时候,validation很重要,需要写,包括requestvalidation和modelvalidation。..
