2017-08-14 4 views
0

Ich bin sehr grün bei Laravel (erstes Projekt), also ertragen Sie mit mir, wenn ich Anfängerfehler mache. Ich versuche dieses Projekt zu erstellen, während ich durch Laracasts laufe, also benutze ich seine Vorschläge. Ich benutze Laravel 5.4 und PHP 7.1.4Laravel 5 wie man Mutator vor der Validierung laufen lässt

Ich habe ein Kontrollkästchen in einem Formular für ein boolesches Feld. Wenn das Kontrollkästchen beim Übergeben des Formulars nicht aktiviert ist, wird null zurückgegeben. Ich möchte keine Null-Werte für Boolesche Werte haben, deshalb habe ich einen Validator, der sicherstellt, dass er nur Wahr/Falsch-Werte akzeptiert. Damit dies funktioniert, musste ich einen Mutator erstellen, um den Wert in false zu ändern, wenn er null war.

Ich habe zwei Modelle, Item und ItemNote. Ich versuche, ItemNote aus dem Item-Modell zu erstellen. Auf der Item-Seite gibt es einen Platz zum Hinzufügen der ItemNote, die durch den ItemNoteController läuft. Ich rufe dann eine Methode in Item auf, um ItemNote hinzuzufügen. Das Problem ist, dass der Mutator nicht im ItemNote-Modell ausgeführt werden kann, sodass die Validierung fehlschlägt, weil das boolesche Feld (calendar_item) null ist.

Ich habe zuerst versucht, ItemNote aus der Beziehung mit Item zu erstellen, entsprechend diesem Stapelüberlauf Laravel 5 mutators only work when I create a record and not when I update a record Antwort der Mutator wird nicht ausgeführt, wenn über eine Beziehung $ this-> notes() -> create ($ request-> alle()). Sie müssen das Modell verwenden $ this-> notes-> create ($ request-> all()) Beachten Sie das Fehlen von Klammern nach Noten. Also habe ich alles versucht, was ich mir vorstellen kann, um zu versuchen, das Objekt über das Modell zu erstellen, und ich kann den Mutator immer noch nicht zum Laufen bringen.

Hier sind die Beziehung Erklärungen in meiner Modelle:

Artikel

public function notes() { return $this->hasMany(ItemNote::class); } 

ItemNote

public function item() { return $this->belongsTo(Item::class); } 

Mutator in ItemNote für calendar_item

protected function setCalendarItemAttribute($value) { $this->attributes['calendar_item'] = isset($value) ? $value : FALSE; } 

Die v alidierung Regeln in ItemNote

public static $validationRules = array('note_date' => 'required|date', 
              'resolve_date' => 'nullable|date', 
              'notes' => 'required|string', 
              'cost' => 'nullable|numeric', 
              'calendar_item' => 'required|boolean', 
              'attachment_path' => 'nullable|string|max:200'); 

Dies ist die Aktion in ItemNoteController, der ausgeführt wird, wenn eine ItemNote von der Artikelseite hinzufügen

public function store(Item $item) 
{ 
    $this->validate(request(), ItemNote::$validationRules); 

    $item->addNote(new ItemNote(request(['item_note_category_id', 'note_date', 'resolve_date', 
             'notes', 'cost', 'calendar_item', 'attachment_path']))); 

    return back(); 
} 

Hier wird die Funktion addNote im Item-Modell

public function addNote(ItemNote $note) 
{ 
    $this->item_note->save($note); 
} 

Hier sind die verschiedenen Dinge, die ich in AddNote versucht habe, sie alle nicht den Mutator ausführen. Die create-Anweisungen haben die Feldzuweisungen aufgelistet, aber ich habe sie hier der Kürze halber entfernt.

$this->notes->save($note); 
$this->notes()->save($note); 
$this->item_note->save($note); 
$this->notes->create 
$this->item_notes->create 
$this->item_notes()->create 
$this->item_note->create 
$this->item_note()->create 
$this->ItemNote->create 
$this->ItemNote()->create 
ItemNote::create 

Alle der oben genannten Arbeit, obwohl ich $ this- denken würde> item_notes-> schaffen sollte überhaupt nicht funktionieren, weil die Beziehung Name Notizen, aber es beschwert sich nicht, was es mir denken lässt, kann nicht zu diesem Code und es ist auf die Validierung im Controller fehlgeschlagen. Wie bekomme ich die Mutatoren vor der Validierung? Oder gibt es eine bessere Möglichkeit, die Daten vor der Validierung zu bereinigen?

Ich habe auch versucht, das Feld item_id in die Validierungsregeln zu setzen, aber das schlägt immer fehl, weil die item_id erst zugewiesen wird, wenn ich das Objekt über die Beziehung erstellt habe. Ich möchte es verlangen, habe aber nicht herausgefunden, wie es in der Anfrage zugewiesen wird.

Jede Hilfe wird geschätzt. Entschuldigung für die lange Post.

+0

Sie wissen nicht, what't falsch, aber diese Syntax korrekt ist: $ this-> Notizen() -> speichern ($ Hinweis); –

+0

Was ist das Ergebnis von dd ($ item-> addNote (new ItemNote (request (...)))); –

+0

Ich habe dd ($ item-> addNote (neu ItemNote (Anfrage ([ 'item_note_category_id', 'note_date', 'resolve_date', 'merkt', 'Kosten', 'calendar_item', 'attachment_path'])))) ; vor der validate-Anweisung und ich habe FatalThrowableError Aufruf an Member-Funktion save() auf Null. Vielleicht sollte ich es nach der Validierung woanders hinstellen? – PhishTail

Antwort

0

Ihre Mutatoren sind auf Ihrem Modell. Während Sie die Controller-Eigenschaft ValidatesRequests verwenden, um Ihre Anfrage-Eingabedaten zu überprüfen. Ihre Mutatoren werden also erst aufgerufen, nachdem Sie Ihre Validierung durchgeführt haben.

Ich sehe also, dass Sie zwei Möglichkeiten haben.

a. Ändern Sie Ihren HTML-Code, um sicherzustellen, dass Sie immer einen booleschen Wert erhalten. Verwenden Sie beispielsweise eine versteckte Eingabe mit einem Standardwert. Dieser Wert wird nur gesendet, wenn das Kontrollkästchen nicht aktiviert ist.

<input name="example" type="hidden" value="0"> 
<input name="example" type="checkbox" value="1"> 

b. Hydratisieren Sie Ihr Modell, rufen Sie Ihre Mutatoren auf und führen Sie Ihre Validierung durch.

$itemNote = new ItemNote($request->all()); 
$request->merge($itemNote->toArray()); 

$this->validate($request, ItemNote::$validationRules); 
// ... 

Bearbeiten: Hier sind einige Links zu meiner Modellvalidierung. Es könnte nützlich sein und Ihnen Ihre eigenen Ideen geben.

https://gist.github.com/robsimpkins/2fe0de2483d51f1e4446ec90be7d96ae https://gist.github.com/robsimpkins/6a2f20853a2d01260ab299ebcebf9673 https://gist.github.com/robsimpkins/7df10abce1cdc07593d8c872a5461425 https://gist.github.com/robsimpkins/c4aa0517a80b794a2d347912100bd6d9

+0

Hier ist, was ich versucht habe
$ note = new ItemNote (Anfrage (['item_note_category_id', 'note_date', 'resolve_date', 'Notizen', 'Kosten', 'calendar_item', 'attachment_path']));
$ request-> merge ($ note-> toArray());
$ this-> validate ($ Anfrage, ItemNote :: $ validationRules);
$ item-> addNote ($ Hinweis);
Ich bekomme einen Fehler undefinierte Variable Anfrage in der Zeile für die Zusammenführung. Ich habe versucht, $ request = new Request() hinzuzufügen; über dem Code, aber mehr Fehler. – PhishTail

+0

Leider kann ich nicht herausfinden, wie Zeilenumbrüche in einem Kommentar hinzufügen – PhishTail

+0

Sie müssen die 'Illuminate passieren \ Http \ Request' Instanz zu Ihrem Controller-Aktion' public function Speicher (Anfragen, $ request, Item $ item) ' – fubar