Laravel中使用FormRequest进行表单验证方法及问题汇总_php技巧_脚本之家

在`Laravel`中,每三个央浼都会棉被服装进为三个`Request`对象,`Form
Request`对象正是包涵了附加验证逻辑的自定义`Request`类。
本文分析了FormRequest至极的管理流程并提议了自定义管理FormRequest验证退步的思路。

www.6766.com,全数示例基于Laravel 5.1.39

今每日气不错,大家的话说表单验证。

Controller中做表单验证

生龙活虎对同学把表单验证逻辑写在Controller中,比如这几个对客户提交商议内容的求证:

 'required', // 只是实例,就写个简单的规则,你的网站要是这么写欢迎在评论里贴网址 ]); if  { return redirect ->withErrors ->withInput(); } }

那般写的话,表单验证和作业逻辑挤在同步,大家的Controller中就能有太多的代码,何况再也的表达准则基本也是复制粘贴。

我们得以应用Form
Request来封装表单验证代码,进而精练Controller中的代码逻辑,使其注意于职业。而单身出来的表单验证逻辑以致能够复用到其余央求中,比如更正商量。

什么是Form Request

在Laravel中,每一个央求都会被打包为二个Request对象,Form
Request对象正是含有了额外验证逻辑的自定义Request类。

何以利用Form Request做表单验证

Laravel中使用FormRequest进行表单验证方法及问题汇总_php技巧_脚本之家。Laravel提供了生成Form Request的阿特isan命令:

$ php artisan make:request StoreCommentRequest

于是乎就生成了app/Http/Requests/StoreCommentRequest.php,让我们来剖析一下内容:

那么很容易,我们除了让authorize方法返回true之外,还得让rules方法返回我们的验证规则:接着修改我们的Controller:这样Laravel便会自动调用StoreCommentRequest进行表单验证了。异常处理如果表单验证失败,Laravel会重定向到之前的页面,并且将错误写到Session中,如果是AJAX请求,则会返回一段HTTP状态为422的JSON数据,类似这样:{comment: ["The comment field is required."]}这里就不细说提示信息怎么修改了,如果有人想看相关教程,可以留言。我们主要来说说怎么定制错误处理。通常来说,Laravel中的错误都是异常,我们都可以在appExceptionshandler.php中进行统一处理。Form Request确实也抛出了一个IlluminateHttpExceptionHttpResponseException异常,但这个异常是在路由逻辑中就被特殊处理了。首先我们来看看Form Request是如何被执行的:IlluminateValidationValidationServiceProvider:registerValidationResolverHook(); // 看我看我看我 $this->registerPresenceVerifier(); $this->registerValidationFactory(); } /** * Register the "ValidatesWhenResolved" container hook. * * @return void */ protected function registerValidationResolverHook() // 对,就是我 { // 这里可以看到对`ValidatesWhenResolved`的实现做了一个监听 $this->app->afterResolving(function (ValidatesWhenResolved $resolved) { $resolved->validate(); // 然后调用了它的`validate`方法进行验证 }); }// ...

您猜对了,Form
Request就贯彻了那么些IlluminateContractsValidationValidatesWhenResolved接口:

FormRequest基类中的validate方法是由这个IlluminateValidationValidatesWhenResolvedTrait实现的:IlluminateValidationValidatesWhenResolvedTrait:getValidatorInstance(); // 这里获取了`Validator`实例 if (! $this->passesAuthorization { $this->failedAuthorization(); // 这是调用了访问授权的失败处理 } elseif ) { $this->failedValidation; // 这里调用了验证失败的处理,我们主要看这里 } } // ...

在validate里,假如证实失利了就能够调用$this->failedValidation(卡塔尔,继续:

IlluminateFoundationHttpFormRequest:

response( // 这里抛出了传说中的异常 $this->formatErrors; }

到头来看出那么些了!不过那几个那些在另一个地点被拍卖了:

IlluminateRoutingRoute:

container = $this->container ?: new Container; try { if (! is_string($this->action['uses'])) { return $this->runCallable; } if ($this->customDispatcherIsBound { return $this->runWithCustomDispatcher; } return $this->runController; } catch (HttpResponseException $e) { // 就是这里 return $e->getResponse(); // 这里直接返回了Response给客户端 } } // ...

由来,整个思路决定清晰,可是大家照旧看看这里生成的HttpResponseException相当中的Response是怎么转移的:

IlluminateFoundationHttpFormRequest:

wantsJson { // 对AJAX请求的处理 return new JsonResponse; } return $this->redirector->to($this->getRedirectUrl // 对普通表单提交的处理 ->withInput($this->except ->withErrors($errors, $this->errorBag);// ...

怎么样落到实处自定义错误管理,这里提供八个思路,都急需重写appHttpRequestsRequest的failedValidation:

抛出三个新非凡,世襲HttpResponseException分外,重新完成getResponse方法,这些可怜类我们得以放手app/Exceptions/下便于处理,错误重返照旧提交Laravel;

抛出一个我们自定义的百般,在appExceptionshandler中处理。

切实得以达成这里就不写啊(参阅Laravel文书档案中关于错误管理部分,汉语文书档案传送门),假若您有别的艺术大概主见能够在评价一月作者调换。

补充

就算你的Controller使用IlluminateFoundationValidationValidatesRequests这些Trait的validate方法开展表达,相像的,这里表明败北也会抛出IlluminateHttpExceptionHttpResponseException卓殊,能够参见上边的化解方案举办拍卖。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图