Laravel 5:如何使用包含预填充值的表单的redirect() - > withInput()?

时间:2016-05-20 00:41:19

标签: laravel laravel-5

我正在学习Laravel 5.我正在尝试构建一个简单的表单来编辑数据库中的现有记录,我对如何在此使用withInput()old()感到困惑情况下。

例如,请考虑以下路由和控制器:

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

} ] );

这是相应的模板:

<!-- 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. 用户请求GET / book(我们将此页面称为#1)。 book.edit控制器从数据库加载书的标题(恰好是“50 Shades of Grey”),并将该字符串传递给视图。用户在字段中看到预填充值为“50 Shades of Grey”的表单。到目前为止,非常好。

  2. 用户修改该标题 - 比如“双城记” - 并提交表格。

  3. book.update路由处理此请求,并发现它无效。它会将用户重定向回book.edit路由(我们将此页面称为#2)。

  4. book.edit重新渲染相同的视图,再次将title的值设置为“50灰度阴影”(这是不正确的)。

  5. 这是我要解决的部分:如何在页面加载#1上显示数据库中的标题,但是在页面加载#2时重新显示用户的输入?

    现在,我理解为什么此代码以这种方式运行。我只是不明白我是怎么想的这样做。

    可能的解决方案(以及我不喜欢它们的原因):

    • 在我的模板中,我可以使用value="{{ old('title') }}"代替value="{{ $title }}"。这将解决页面加载#2上的问题 - 但这意味着页面加载#1上的title字段将空白

    • 我可以在视图中添加一些逻辑 - 类似于:{{ if $wasRedirected ? old('title') : $title }}这只是感觉是hackish和错误 - 它看起来不像应该在视图中那样。

    • 我可以为book.edit请求添加一些逻辑 - 类似于'title' => $wasRedirected ? Request::get('title') : $book->title。这也感觉很乱和错误。

    我可能只是误解了某些东西,或者遗漏了一些明显的东西。在Laravel 5中,编辑表单通常的处理方式如何?必须有一个标准模式,对吧?

1 个答案:

答案 0 :(得分:1)

old()助手的签名是:

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

您可以将数据库中的值作为默认值传递。

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