2016-05-20 2 views
0

私はLaravel 5を学んでいます。データベースから既存のレコードを編集するためのシンプルなフォームを作成しようとしていますが、ここではwithInput()old()の使い方が混乱しています。検討し、ここで、次のユーザフローLaravel 5:リダイレクトを使用する方法() - >事前に設定値が含まれているフォームでwithInput()?

<!-- 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> 

  1. ユーザーを

    ここ
    <?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 
    
    } ]); 
    

    が対応するテンプレートです:

    たとえば、次のルートとコントローラを考えますGET/bookをリクエストします(このページはload#1と呼ばれます)。 book.editコントローラは、データベースから(「グレイのシェード50」であることを起こる)書籍のタイトルをロードし、ビューを切っその文字列を渡します。ユーザーはフィールドに「50 Shades of Grey」という値が設定されたフォームを表示します。ここまでは順調ですね。 「二都物語」、と言う - -

  2. ユーザーは、そのタイトルを変更し、フォームを送信します。

  3. book.updateルートは、この要求を処理し、それが無効で見つけました。ユーザーはbook.editルートにリダイレクトされます(このページは負荷#2と呼ばれます)。

  4. book.edit再度同じ値をtitleの値に設定します(これは間違っています)。

これは私が解決しようとしている部分です:どのように私は、ページの読み込み#1上のデータベースからタイトルを表示するが、ページの読み込み#2でのユーザーの入力を再表示することができますか?

は今、私はこのコードはこのように動作理由を理解しています。私はちょうど私がそれをやってするをなってるか理解していません。

可能な解決策(と、なぜ私はそれを好きではない):私のテンプレートで

  • 、私はvalue="{{ old('title') }}"の代わりvalue="{{ $title }}"を使用することができます。これはページロード#2の問題を解決しますが、titleフィールドはブランクページロード#1になります。

  • ビューにいくつかのロジックを追加することができます:{{ if $wasRedirected ? old('title') : $title }}これはちょっとハックして間違っているように見えますが、それはビュー内にあるべきもののようなものではありません。

  • 'title' => $wasRedirected ? Request::get('title') : $book->titleのような何らかのロジックをbook.editリクエストに追加することができます。これはまた、ハックと間違って感じる。

私は恐らく何かを誤解しているか、明らかに何かを見逃しています。どのようにしてこのフォームを編集するのですか通常はLaravel 5で処理されますか?標準的なパターンがあるはずですよね?

+0

あなたが使用できる便利なメソッドを提供し、一つの共通の解決策は、(https://laravelcollective.com/docs/5.2/html)[Laravelの集団からフォーム&HTMLコンポーネント]をインストールすることであると思われます表示する内容を自動的に把握するビュー。私はそのオプションについていますが、サードパーティ製のアドオンに頼らずに、これをvanilla Laravelで行う方法はありますか? – greenie2600

答えて

1

old()ヘルパーのシグネチャは次のとおりです。

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

あなたは、デフォルトとして、データベースから値を渡すことができます。

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

ああ!ありがとうございました!私はそれが単純でなければならないことを知っていた。 – greenie2600

+0

乾杯!追加されたノートでは、Laravelの "キーで取得"機能/メソッド/ヘルパーは通常この署名を持っています。 – Doom5

関連する問題