laravel5.4表单验证的问题,谢谢大家!

我自定义了个功能,就是防止IP重复注册,但是在表单验证的时候提交页面没有效果,请问哪里错了?

protected function validator(array $data)
    {
        $ip = DB::table('users')->whereRaw('ip = ? and created_at > ?', [get_client_ip(), Carbon::now()->subMinutes(60)])->count();
        $data = array_add($data,'ip',(string)$ip);
        return Validator ::make($data, [
            'name'     => 'required|string|max:255',
            'email'    => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
            'captcha'  => 'required|captcha',
            'ip'       => 'required|same:0',
        ], [
            'captcha.required' => '请输入验证码!',
            'captcha.captcha'  => '验证码错误',
            "ip.same"      => "同一IP在60分钟内无法再次注册",
        ]);
    }

追加的IP字段假如不等于0的话就提示错误,等于0的时候就默认通过验证.

阅读 1.8k
2 个回答

我觉得这里可以用unique规则,个人习惯用自定义验证类:

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class SignUpRequest extends FormRequest {

    public function authorize() {
        return true;
    }

    public function rules() {

        return [
            'name'     => 'required|string|max:255',
            'email'    => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
            'captcha'  => 'required|captcha',
            'ip' => [
                'required',
                Rule::unique('users')->where(function ($query) {
                    $query->where([
                        ['ip', get_client_ip()],
                        ['created_at', '>', now()->subMinutes(60)]
                    ]);
                )}
            ]
        ];
    }

    public function messages() {
        return [
            'captcha.required' => '请输入验证码!',
            'captcha.captcha'  => '验证码错误',
            "ip.unique"      => "同一IP在60分钟内无法再次注册",
        ];
    }
}

可以试试

你建一张表, 注册成功之后存入ip。 下次注册的时候检测一下60分钟内是否已经注册, 如果没有就可以注册。

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