Laravel在注册表上进行自定义验证

时间:2016-10-31 14:52:08

标签: php laravel

我目前正在努力对注册表单进行一些验证。

基本上,当用户注册时,它会检查他们输入的唯一代码是否有效,如果没有,则不会让他们注册。

但是在我的代码表中,我从代码中读取的代码也有一个到期日。

在认为有效期限没有过期后我需要再做一次检查,换句话说,它不会比现在更长。

我认为你可以在验证器中做到这一点,但我在语法上有点挣扎,不知道它应该去哪里。这是我的代码:

protected function validator(array $data)
{

    return Validator::make($data, [
        'code' => 'required|exists:codes',
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',
        'date_of_birth' => 'required|date',
        'password' => 'required|min:6|confirmed',
        'accept_terms' => 'required|accepted',
    ]);
}

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return User
 */
protected function create(array $data)
{   
    Code::where('code', $data['code'])->increment('uses');

    $data['code_id'] = Code::where('code', $data['code'])->value('id');

    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'date_of_birth' => $data['date_of_birth'],
        'accept_terms' => $data['accept_terms'],
        'code' => $data['code'],
        'code_id' => $data['code_id'],
        'password' => bcrypt($data['password']),
    ]);
}

提前致谢:)

2 个答案:

答案 0 :(得分:3)

只要您使用Laravel v5.3.18(或更高版本),就可以使用Rule类来保存您必须定义的自定义规则。

此:

'code' => 'required|exists:codes',

可替换为:

'code' => [
    'required',
    Rule::exists('codes')->where(function ($query) {
        $query->where('expiry_date', '>=', Carbon::now());
    }),
],

(以上假设expiry_date是db表中列的实际名称。)

文档:https://laravel.com/docs/5.3/validation#rule-exists

请确保您导入这些外墙。

希望这有帮助!

答案 1 :(得分:2)

你可以create custom validation rule。创建服务提供商并注册它。然后添加如下内容:

Validator::extend('is_code_valid', function($attribute, $value, $parameters, $validator) {
    $code = Code::where('code', $value)->where('date', '>', Carbon::now())->first();
    return !$code->isEmpty(); // Pass if valid code exists in DB.
});

然后使用它:

'code' => 'required|is_code_valid',