2016-05-20 5 views
0

Ich lerne Laravel 5. Ich versuche, ein einfaches Formular zu erstellen, einen vorhandenen Datensatz aus der Datenbank zu bearbeiten, und ich bin verwirrt, wie in diesem Fall withInput() und old() zu verwenden.Laravel 5: Wie verwendet man redirect() -> withInput() mit Formularen, die voraufgefüllte Werte enthalten?

Betrachten wir zum Beispiel die folgenden Routen und Controller:

<?php 

// routes.php 

use App\Book; 

Route::get('/book', [ 'as' => 'book.edit', function() { 
    $book = Book::find(1); 
    return view('book', [ 
     'title' => $book->title 
    ]); 
} ]); 

Route::post('/book', [ 'as' => 'book.update', function() { 

    $validator = Validator::make(Request::all(), [ 
     // This validator will (almost) always fail. This is deliberate, to 
     // illustrate the problem I'm describing. 
     'title' => 'in:zzzzz|required' 
    ]); 

    if ($validator->fails()) { 
     return redirect(route('book.edit')) 
      ->withInput() 
      ->withErrors($validator); 
    } 

    // TODO: save book 

} ]); 

Hier ist die entsprechende Vorlage:

<!-- book.blade.php --> 

<form action="{{ route('book.update') }}" method="post"> 

    <label>Book Title:</label> 
    <input type="text" name="title" value="{{ $title }}"> 

    @if ($errors->has('title')) 
     <strong>{{ $errors->first('title') }}</strong> 
    @endif 

    <button type="submit">Save</button> 

    {{ csrf_field() }} 

</form> 

Nun betrachten wir die folgenden Benutzerfluss:

  1. Der Benutzer Anfragen GET/book (wir rufen diese Seite laden # 1). Der Controller book.edit lädt den Buchtitel (der zufälligerweise "50 Shades of Grey" ist) aus der Datenbank und übergibt diesen String an die Ansicht. Der Benutzer sieht das Formular mit dem Wert "50 Shades of Grey", der im Feld ausgefüllt ist. So weit, ist es gut.

  2. Der Benutzer ändert diesen Titel - sagen wir zu "Eine Geschichte zweier Städte" - und reicht das Formular ein.

  3. Die Route book.update verarbeitet diese Anforderung und findet sie ungültig. Es leitet den Benutzer zurück an die Route book.edit (wir rufen diese Seite laden # 2).

  4. book.edit reproduziert die gleiche Ansicht erneut und setzt den Wert title erneut auf "50 Shades of Grey" (was falsch ist).

Dies ist der Teil ich versuche zu lösen: wie kann ich den Titel aus der Datenbank auf Seite Last # 1, zeige aber erneut anzuzeigen die Eingabe des Benutzers auf Seite Last # 2?

Jetzt verstehe ich warum dieser Code verhält sich so. Ich verstehe einfach nicht, wie ich bin angenommen, es zu tun.

Mögliche Lösungen (und warum Ich mag sie nicht):

  • In meiner Vorlage, konnte ich value="{{ old('title') }}" statt value="{{ $title }}" verwenden. Dies wird das Problem beim Seitenladen # 2 lösen - aber es bedeutet, dass das Feld titleblank auf Seite laden # 1 sein wird.

  • Ich könnte etwas Logik zur Ansicht hinzufügen - so etwas wie: {{ if $wasRedirected ? old('title') : $title }} Das fühlt sich nur hackish und falsch an - es scheint nicht die Art von Sache, die in der Ansicht sein sollte.

  • Ich könnte der book.edit Anfrage etwas Logik hinzufügen - so etwas wie 'title' => $wasRedirected ? Request::get('title') : $book->title. Dies fühlt sich auch hackisch und falsch an.

Ich bin wahrscheinlich nur etwas falsch zu verstehen oder etwas offensichtlich zu verpassen. Wie wird dieser Aspekt von Bearbeitungsformularen normalerweise in Laravel 5 gehandhabt? Es muss ein Standardmuster geben, oder?

+0

Es scheint, dass eine gemeinsame Lösung [die Formulare & HTML-Komponente aus Laravel Collective] (https://laravelcollective.com/docs/5.2/html), die Bequemlichkeit Methoden bietet installieren ist, mit dem Sie in kann Ihre Ansicht, die automatisch herausfinden, was angezeigt werden soll. Ich bin offen für diese Option - aber gibt es eine Möglichkeit, dies in Vanille Laravel zu tun, ohne auf Add-Ons von Drittanbietern zurückgreifen zu müssen? – greenie2600

Antwort

1

Die Signatur für die old() Helfer ist:

function old($key = null, $default = null) 

Sie den Wert aus der Datenbank als Standard passieren können.

old('title', $book->title) 
+0

Ah! Vielen Dank! Ich wusste, dass es einfach sein musste. – greenie2600

+0

Prost! Bei einer zusätzlichen Notiz haben Laravels "fetch by key" -Funktionen/Methoden/Helfer diese Signatur. – Doom5

Verwandte Themen