2017-09-05 4 views
0

Ich sehe von hier: https://github.com/andersao/laravel-validatorWie kann ich die Bedingung in der Validator-Schnittstelle Laravel hinzufügen?

Zum Beispiel der Code wie folgt:

use \Prettus\Validator\LaravelValidator; 

class PostValidator extends LaravelValidator { 

    protected $rules = [ 
     ValidatorInterface::RULE_CREATE => [ 
      'title' => 'required', 
      'text' => 'min:3', 
      'author'=> 'required' 
     ], 
     ValidatorInterface::RULE_UPDATE => [ 
      'title' => 'required' 
     ] 
    ]; 

} 

I Bedingung hinzufügen möchten, wenn der Benutzer Mitglied ist (if(Auth::id())) dann nicht das Feld Autor

erforderlich

So ist die Validator wie folgt sein:

Der Autor benötigt, wenn der Benutzer Gast ist (keine lo gin)

Ob es gemacht werden kann?

Antwort

0

der Laravel documentation hat einen Abschnitt über benutzerdefinierte

+0

Versuchen Sie, meine Frage sorgfältig zu lesen. Ich benutze ein anderes Paket –

+0

Von dem, was ich sehe, müssen Sie noch benutzerdefinierte Logik definieren, das Paket ist nur ein Gebäude-Schnittstelle – Quezler

0

Validierer Da Sie keine Anweisungen in einer Klasse Eigenschaften ausführen können, können Sie versuchen, die create Methode Ihrer Repository Instanz außer Kraft zu setzen, um die $rules Parameter zu ändern, bevor sie tatsächlich das schaffen stattfinden.

Also in Ihrem Repository Klasse, überschreiben die Methode create:

public function create(array $attributes) 
{ 

    $oldRule = $this->rules[ValidatorInterface::RULE_CREATE]['author']; 

    if(Auth::guest()){ // or use the preferred check 
     unset($this->rules[ValidatorInterface::RULE_CREATE]['author']); 
    } 

    $this->makeValidator(); 
    $res = parent::create($attributes); 

    $this->rules[ValidatorInterface::RULE_CREATE]['author'] = $oldRule; 

    return $res; 
} 

EDIT

Eine andere Methode könnte benutzerdefinierte Validierungslogik in Ihrer PostValidator werden Angabe wie folgt:

use \Prettus\Validator\LaravelValidator; 

class PostValidator extends LaravelValidator { 

    const RULE_CREATE_FOR_MEMBER = 'RULE_CREATE_FOR_MEMBER'; 

    protected $rules = [ 
     ValidatorInterface::RULE_CREATE => [ 
      'title' => 'required', 
      'text' => 'min:3', 
      'author'=> 'required' 
     ], 
     self::RULE_CREATE_FOR_MEMBER => [ 
      'title' => 'required', 
      'text' => 'min:3' 
     ], 
     ValidatorInterface::RULE_UPDATE => [ 
      'title' => 'required' 
     ] 
    ]; 

    public function passes($action = null) 
    { 
     if($action == ValidatorInterface::RULE_CREATE && \Auth::id()) { 
      $action = self::RULE_CREATE_FOR_MEMBER; 
     } 

     return parent::passes($action); 
    } 

} 

Aber wieder müssen Sie das Standardverhalten überschreiben, d Es liegt an Ihnen, zu entscheiden, welche die einfachste Lösung für Ihre Bedürfnisse ist.

+0

Es sieht kompliziert aus. Ich denke, es scheint in der Lage zu sein, Bedingungen in PostValidator Klasse –

+0

hinzufügen Es ist nicht so kompliziert meiner Meinung nach. Eine andere Methode wäre, einen anderen Validator für einen anderen Benutzertyp (angemeldeten Benutzer oder Gast) zu setzen. Das einzige Problem ist, dass wenn ich den Repo auf Ihrem Controller instanziiere, ich nicht so sicher bin, dass das Auth-Objekt zur Bauzeit Ihres Controllers instanziiert würde. – Desh901

+0

In beiden Fällen müssen Sie eine Standardfunktionalität Ihres Validators außer Kraft setzen. Wenn Sie Ihre Validator-Klasse außer Kraft setzen möchten, müssen Sie die Methode "Pässe" überschreiben und Ihre geänderten Regeln angeben. – Desh901

Verwandte Themen