2016-10-31 35 views
2

Ich bin derzeit mit ein bisschen Validierung auf einem Anmeldeformular kämpfen.Laravel benutzerdefinierte Validierung auf Anmeldeformular

Grundsätzlich, wenn ein Benutzer registriert, wird überprüft, ob der eindeutige Code, den sie eingegeben haben, gültig ist und wenn nicht, lassen sie sich nicht anmelden.

Aber in meiner Codetabelle, die das liest, habe ich auch ein Ablaufdatum auf dem Code.

Ich muss eine weitere Überprüfung durchführen, nachdem es gültig ist, dass das Ablaufdatum nicht abgelaufen ist, mit anderen Worten, es ist nicht größer als jetzt.

Ich denke, Sie können dies im Validator tun, aber ich habe ein wenig mit der Syntax und nicht sicher, wohin es gehen soll. Hier ist mein Code:

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

Vielen Dank im Voraus :)

+0

Welche Version von Laravel verwenden Sie? –

+0

Sorry, ich sollte dies klar gemacht haben, ich benutze Laravel 5.3 – user6073700

Antwort

3

Solange Sie Laravel v5.3.18 verwenden (oder höher) können Sie die Rule Klasse verwenden, können Sie speichern zu müssen Definieren einer benutzerdefinierten Regel Diese

:

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

Kann ersetzt werden durch:

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

(die oben geht davon aus expiry_date ist der tatsächliche Name der Spalte in der Tabelle db).

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

So stellen Sie sicher, dass Sie diese Fassaden importieren.

Hoffe, das hilft!

+0

Vielen Dank das ist genau das, was ich suchte, aber konnte nicht die Syntax richtig. Es scheint einen Fehler zu werfen, obwohl 'FatalThrowableError in RegisterController.php Zeile 56: Parse-Fehler: Syntaxfehler, unerwartete 'Carbon' (T_STRING), erwartet ',' oder ')' – user6073700

+0

@ user6073700 Wie gesagt, Sie brauchen um sicher zu stellen, dass die Fassaden enthalten sind, ändern Sie sie in 'Carbon \ Carbon :: now()' –

+0

Ye ich tat, dass es immer noch den gleichen Fehler zeigt – user6073700

1

Sie können create custom validation rule. Erstellen Sie einen Dienstanbieter und registrieren Sie ihn. Dann etwas wie folgt hinzu:

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. 
}); 

Und dann verwenden:

'code' => 'required|is_code_valid', 
Verwandte Themen