【问题标题】:Laravel 5: How to use redirect()->withInput() with forms that contain prepopulated values?Laravel 5:如何将 redirect()->withInput() 与包含预填充值的表单一起使用?
【发布时间】:2016-05-20 00:41:18
【问题描述】:

我正在学习 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 种灰色”),并将该字符串传递给视图。用户会看到该字段中预填充了“50 种灰色”值的表单。到目前为止,一切顺利。

  2. 用户将标题修改为“两个城市的故事”,然后提交表单。

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

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

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

现在,我明白了为什么这段代码会这样。我只是不明白我是如何应该这样做的。

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

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

  • 我可以在视图中添加一些逻辑——例如:{{ if $wasRedirected ? old('title') : $title }} 这只是感觉很老套和错误——它似乎不应该出现在视图中。

  • 我可以在book.edit 请求中添加一些逻辑——比如'title' =&gt; $wasRedirected ? Request::get('title') : $book-&gt;title。这也让人感觉很老套和错误。

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

【问题讨论】:

  • 似乎一种常见的解决方案是安装the Forms & HTML component from Laravel Collective,它提供了方便的方法,您可以在视图中使用这些方法自动确定要显示的内容。我对这个选项持开放态度——但有没有办法在原版 Laravel 中做到这一点,而无需借助第三方插件?

标签: laravel laravel-5


【解决方案1】:

old() 助手的签名是:

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

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

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

【讨论】:

  • 啊!谢谢!我知道它必须简单。
  • 干杯!补充一点,Laravel 的“按键获取”函数/方法/助手通常有这个签名。
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2015-04-26
  • 2017-10-31
相关资源
最近更新 更多