2016-05-15 27 views
4

Ich habe Modell wie diesesLaravel 5 Validierung Modell

class test extends Model 
{ 

public $rules = [ 
    'title' => 'required', 
    'name' => 'required', 
]; 
protected $fillable = ['title','name']; 
} 

Und Controller wie diese

public function store(Request $request) 
{ 
    $test=new test; /// create model object 
     $validator = Validator::make($request->all(), [ 
      $test->rules 
     ]); 
     if ($validator->fails()) { 
      return view('test')->withErrors($validator) 
     } 
     test::create($request->all()); 
} 

Validation zeigen Fehler wie diese

Das 0 Feld erforderlich ist.

ich zeigen will, dass dieses

Der Name Feld ist erforderlich.
Das Titelfeld ist erforderlich.

Antwort

6

Ich löse es

public function store(Request $request) 
{ 
    $test=new test; /// create model object 
    $validator = Validator::make($request->all(),$test->rules); 
    if ($validator->fails()) { 
     return view('test')->withErrors($validator) 
    } 
    test::create($request->all()); 
} 
+0

Was ist, wenn ich dieses generische (wie API) so machen möchte, dass es aufgerufen werden kann aus jeder Sicht. Wie würde ich es an die gleiche Ansicht weitergeben (ohne zu wissen). –

+0

@VeerShrivastav vielleicht können Sie sich eine Helferklasse schreiben? – Hackbard

0

Sie machen es falsch. Das rules Array sollte entweder in Ihrem Controller oder besser in einem Form Request sein.

Lassen Sie mich Ihnen einen besseren Ansatz:

Erstellen Sie ein neues Formular anfordern Datei mit php artisan make:request TestRequest.

Beispiel TestRequest Klasse:

namespace App\Http\Requests; 

use App\Http\Requests\Request; 

class TestRequest extends Request 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     return true; 
    } 

    /** 
    * Get the validation messages. 
    * 
    * @return array 
    */ 
    public function messages() 
    { 
     return [ 
      'title.required' => 'A title is required.', 
      'name.required' => 'The name field is required' 
     ]; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     return [ 
      'title' => 'required', 
      'name' => 'required', 
     ]; 
    } 
} 

die Methode Anfrage Objekt in Ihrem Controller injizieren.

public function store(TestRequest $request) 
{ 
    // You don't need any validation, this is already done 
    test::create($request->all()); 
} 
+7

warum ist es schlecht, die Regeln mit dem Modell zu speichern? Warum erstellen Sie ein zusätzliches Objekt mit der Anfrage mit Validierung Login dort? –

+5

Ich bin von einem Ruby on Rails-Hintergrund und habe Laravel für ein paar Jahre verwendet, persönlich bevorzuge ich den Ansatz in der Modell-Ebene aus zwei Hauptgründen zu validieren: 1. Modelle können von vielen anderen Orten als Benutzereingaben geändert werden , die Integrität der Daten zu erhalten, ist nicht nur für den Frontend-Benutzer, sondern für alle, einschließlich aller Entwickler im Projekt. 2. Custom Request und Validatoren sind nur für Attribute, die Sie von Controllern erhalten haben, sie validieren nicht alle Attribute des Modells, sagen wir, was ist, wenn ein gültiger Kauf von 2 Artikeln das Inventar zu -1 macht. – Jing

+0

Ich würde auch gerne wissen, warum Laravel es so macht. Während ich denke, dass diese Antwort im Allgemeinen gut ist, habe ich markiert, um zu sagen, dass dieser Weg "besser" ist - "besser" ist subjektiv –

Verwandte Themen