2017-01-17 2 views
1

Ich habe einen Kunden Anfrage wie folgt:Laravel - assoziatives Array Validierung in einer benutzerdefinierten Anfrage

<textarea name="intro[en]"></textarea> 
<textarea name="intro[fr]"></textarea> 
<textarea name="intro[de]"></textarea> 

Ich Validieren es mit einem benutzerdefinierten Anfrage:

class UpdateProfileRequest extends Request 
{ 
    public function authorize() 
    { 
     return true; 
    } 

    public function rules() 
    { 
     return [ 
      'intro.*'   => 'required|max:100' 
     ]; 
    } 
} 

Der Validator nicht funktioniert. Ich denke, das liegt daran, dass das. * Nur für nummerierte Arrays und nicht für assoziative Arrays funktioniert.

Ich bin nicht sicher, wie man das macht.

Gibt es eine Möglichkeit, dies mit einer benutzerdefinierten Anforderung wie diesem zu tun? Wenn ja, wie lautet die Syntax?

Ansonsten, was soll ich tun. Ich schrieb bereits einige benutzerdefinierte Code innerhalb der Controller-Methode wie folgt aus:

$hasIntro = false; 
    $hasBio = false; 

    foreach($request->get('intro') as $language => $localIntro) 
    { 
     if(!empty($request->get('intro')[$language])) 
     { 
      $hasIntro = true; 
     } 
    } 

    if(!$hasIntro or !$hasBio) 
    { 
     return redirect()->back()->withErrors('You must enter at least 1 Bio and 1 Intro'); 
    } 

Welche denke ich, eine manuelle Weg sein könnte, darüber zu gehen. Obwohl ich glaube, dass withErrors einen Validator benötigt, bin ich wieder bei demselben Problem ... Obwohl es vielleicht einen Weg gibt, dies manuell zu tun?

Meine ideale Lösung ist, die assoziative Array-Syntax zu finden, wenn diese tatsächlich existiert?

+0

Verwendung foreach-Schleife mit Regeln – Bugfixer

Antwort

1

Ich bin nicht sicher über den richtigen Weg aber meine Idee ist so etwas wie dieses

public function rules($inputs) 
{ 
    $rules = []; 
    foreach ($inputs as $key => $val) { 
     if (strpos($key, "intro") === 0){ 
      $rules[$key] = 'required|max:100'; 
     } 
    } 
    return $rules; 
} 
0
class UpdateProfileRequest extends Request 
    { 
     /** 
     * Determine if the user is authorized to make this request. 
     * 
     * @return bool 
     */ 
     public function authorize() 
     { 
      return true; 
     } 

     /** 
     * Get the validation rules that apply to the request. 
     * 
     * @return array 
     */ 
     public function rules() 
     { 
      return [ 
       'intro.*'    => 'required|max:100' 
      ]; 
     } 


     /** 
     * @param Validator $validator 
     * 
     * @return mixed 
     */ 
     protected function formatErrors(Validator $validator) 
     { 
      return $validator->errors()->all(); 
     } 
    } 

Sie unter denselben Namen haben, so stellen Sie sicher, es ist etwas anderes oder ein entfernen, ändern Namen.

<textarea name="intro[fr]"></textarea> 
<textarea name="intro[fr]"></textarea> 
+0

Das ist ziemlich viel, was ich geschrieben? – iKode

+0

Es ist Arbeit für Sie oder nicht? –

1
public function rules() 
{ 
     $rules = []; 

     $intro = $this->request->get('intro'); 

     if (!empty($intro)) { 
      foreach ($intro as $index => $doc) { 
       $rules[sprintf('intro.%d', $index)] = 'required|max:100'; 
      } 
     } 

     return $rules; 
    }