2016-03-25 28 views
4

Ich erstelle ein Paket und möchte Hook-Funktionalität (das Paket sollte zusätzliche Validierungsregeln einfügen, wenn ein Benutzer ein Feld in meiner App aktualisiert).Haken in Laravel 5?

Ich habe dies mit dem Event-System zu tun. Was ich tue, ist die Übergabe der Variablen $ rules und $ request an den Listener, ich modifiziere die Variable $ rules und gebe sie zurück.

Wäre das eine schlechte Praxis? Was wäre die empfohlene Vorgehensweise?

Ich meine, es funktioniert. Ich bin mir nur nicht sicher, ob das der beste Weg ist.

-Code unten:

SettingsController.php (dies unter App ist/und wo ich auf Update bin Validierung)

public function update(Setting $setting, Request $request) 
{ 
    $rules = [ 
     'package' => 'required|in:'.implode(config('app.packages'),','), 
     'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package, 
     'description' => '', 
    ]; 

    // Is this bad?? 
    $rules = Event::fire(new SettingsWereSubmitted($request,$rules))[0]; 

    $v = Validator::make($request->all(),$rules); 

Da ist in meinem Paket (Pakete/exchange/src/Hörer) bekam ich diesen Hörer (ValidateSettings.php):

public function handle(SettingsWereSubmitted $event) 
{ 
    if($event->request->package == 'exchange') 
    { 
     // Add rules 

     $rules = [ 
      'fee' => 'required|decimal|min_amount:0|max_amount:1|max_decimal:8', 
      'freeze_trade' => 'required|in:1,0', 
     ]; 

     $event->rules['value'] = $rules[$event->request->name]; 

     return $event->rules; 
    } 

} 

Antwort

0

ich an diesem Stück Code suchen

und denken Sie, dass Sie dasselbe Verhalten einfacher erreichen können, indem Sie die Validierungsregel required_if verwenden.

$rules = [ 
     'package' => 'required|in:'.implode(config('app.packages'),','), 
     'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package, 
     'description' => '', 
     'fee' => 'required_if:package,exchange|decimal|min_amount:0|max_amount:1|max_decimal:8', 
     'freeze_trade' => 'required_if:package,exchange|in:1,0', 
    ]; 

ZUSäTZLICH: By the way, ich würde mit Antrag Klassen vorschlagen Einkommensanforderungen zu überprüfen und Validierungscode von Controllern zu entfernen, weil die Validierung des Antrags Verantwortung der Anforderung ist aber nicht Controllers. Es ist ziemlich einfach in Laravel. Zuerst Sie Ihre Anfrage Klasse erstellen in Ihrem Http \ Requests-Ordner:

class UpdateSomethingRequest extends Requst 
{ 

    public function rules() 
    { 
     return [ 
     'package' => 'required|in:'.implode(config('app.packages'),','), 
     'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package, 
     'description' => '', 
     'fee' => 'required_if:package,exchange|decimal|min_amount:0|max_amount:1|max_decimal:8', 
     'freeze_trade' => 'required_if:package,exchange|in:1,0', 
     ]; 
    } 

} 

Und dann entfernen Sie einfach diesen Code von Controller- und Typ-Tip neue Anforderung Klassenmethode zur Aktualisierung wie folgt vor:

public function update(Setting $setting, UpdateSomethingRequest $request) 
{ 
// Your request is already validated here so no need to do validation again 
}