2016-10-31 3 views
2

В настоящее время я боюсь с некоторой валидацией в регистрационной форме.Laravel custom validation on registration form

В основном, когда пользователь регистрируется, он проверяет, действительно ли уникальный код, который они ввели, и если он не позволяет им зарегистрироваться.

Но в моей таблице кодов, которую это читает, у меня также есть дата истечения срока действия кода.

Мне нужно сделать еще один чек после того, как считается действительным, что дата истечения срока действия не прошла, другими словами, она не больше, чем сейчас.

Я думаю, вы можете сделать это в валидаторе, но я немного борюсь с синтаксисом и не уверен, куда он должен идти. Вот мой код:

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']), 
    ]); 
} 

Заранее спасибо :)

+0

Какую версию Laravel вы используете? –

+0

Извините, что я должен был сделать это ясно, я использую Laravel 5.3 – user6073700

ответ

3

Пока вы используете Laravel v5.3.18 (или выше), вы можете использовать Rule Class, чтобы сохранить вас от для определения настраиваемого правила.

Это:

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

Может быть заменен:

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

(выше приобретает expiry_date является фактическое имя столбца в БД таблицу).

Документация: https://laravel.com/docs/5.3/validation#rule-exists

Просто убедитесь, что вы импортировать эти фасады.

Надеюсь, это поможет!

+0

Большое спасибо, это именно то, что я искал, но не смог правильно получить синтаксис. Кажется, что он выдает ошибку, хотя «FatalThrowableError в строке RegisterController.php 56: Ошибка анализа: синтаксическая ошибка, неожиданный« Carbon »(T_STRING), ожидающий«, »или«) » – user6073700

+0

@ user6073700 Как я уже сказал, вам нужно чтобы включить Фасады, иначе измените его на «Carbon \ Carbon :: now()» –

+0

. Я сделал так, что он все еще показывает ту же ошибку. – user6073700

1

Вы можете 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',