laravel 表单验证错误信息的问题

用laravel 做表单的验证.

路由:get为注册视图页面,post为注册的逻辑

Route::get('regist','User\RegistController@registView');
Route::post('regist','User\RegistController@regist');

表单

<form class="form-signin" method="POST" action="/regist">
.....
</form>

验证的代码

$this->validator=Validator::make($input,$rule,$message);
       
if($this->validator->fails()){
    return \Redirect::back()->withErrors($this->err());
}

现在存在的问题是:

表单验证没通过,不显示错误信息.需要在地址栏按一下回车,重新加载一下页面才能显示错误信息,按刷新也不管用.不知道什么原因了.

补充说明:我的表单验证写在一个单独的类中,只想用Validator::make方式实现验证,不用控制器的方法.
阅读 2.3k
1 个回答

Validator::make 是在单独的控制器或其他地方使用的,如果你手写了一个独立的验证类的,继承 Illuminate\Foundation\Http\FormRequest 表单验证类即可

<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

class TestRequest extends FormRequest
{

    /**
     * 验证规则
     */
    public function rules(): array
    {
        return [
            'title'    => 'required|between:8,50',
            'content'  => 'required|min:100',
        ];
    }

    /**
     * 自定义属性别名,可省略
     */
    public function attributes()
    {
        return [
            'title'   => '帖子标题',
            'content' => '帖子内容',
        ];
    }

    /**
     * 自定义错误消息,可省略
     */
    public function messages()
    {
        return [
            'required'         => ':attribute不能为空, 请填写后再提交',
            'title.between'    => '帖子标题长度限制在:min至:max个字之间',
            'content.min'      => '帖子内容至少需要100个字',
            'password.between' => '密码错误',
        ];
    }


    /**
     *
     * 自定义验证失败后的错误处理
     *
     * 必需抛出一个Exception,否则业务代码会继续执行,抛出了Exception则会被框架捕捉处理
     * 直接return返回一个response对象是无效的
     * 
     * 父类 FormRequest 里面默认抛出的是 Illuminate\Validation\ValidationException
     * 如果是表单请求(application/x-www-form-urlencoded)它会重定向回来源页面,并且把错误信息写入flash session,
     * 非表单请求否则返回一个固定格式的json响应
     * 
     * 父类默认的failedValidation不能满足以下需求
     * 1、在实际使用中,有的时候我们想验证失败时始终返回json而不跳转,甚至是xml
     * 2、默认返回的json格式是固定,而我们可能需要自定义一些json字段
     * 
     */
    protected function failedValidation(Validator $validator)
    {
        // 具体内容可以参考 Illuminate\Support\MessageBag 
        $error = $validator->errors();

        // 自定义response对象 Illuminate\Http\Response
        $response = response()->json([
            //...自定义的错误响应内容
            'code'    => 10001,
            'message' => $error->first(),
            'errors'  => $error,
        ]);

        /**
         * 抛出一个HttpResponseException异常类,
         * 这将阻止验证器调用后的后续代码,直接发送response到浏览器
         */
        throw new HttpResponseException($response);
    }
}

在控制器中把这个表单验证类作为控制器参数注入即可

class HomeController extends Controller
{
    public function myaction(TestRequest $request)
    {
        // TestRequest 类验证通过了才会执行myaction里面的代码
        // TestRequest 的验证失败的处理参考failedValidation
        // failedValidation不是必须的,因为父类中已经做了处理,
        // 如果是网页表单请求不需要重写它,如果你是api可以覆盖自己进行失败处理
    }

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进